acm入门基础题解一_New
acm入门基础题解一
Problem A: 数字三角形
#include
#include
const int maxn=110;
int a[maxn][maxn],b[maxn][maxn],n;
void data_set(){
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
scanf("%d",&a[i][j]);
}
}
}
void solve(){
for(int j=1;j<=n;j++)
b[n][j]=a[n][j];
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++){
if(b[i+1][j+1]>b[i+1][j])
b[i][j]=b[i+1][j+1]+a[i][j]; else
b[i][j]=b[i+1][j]+a[i][j]; }
printf("%d\n",b[1][1]);
}
int main(){
while(scanf("%d",&n)!=EOF&&n!=0){
data_set();
solve();
}
return 0;
}
Problem B: 去北京看奥运
#include
#include
const int maxn=110;
const int inf=200000000;
int a[maxn],b[maxn][maxn],dp[maxn][maxn],n;
void data_set(){
for(int j=0;j for(int k=0;k dp[k][j]=inf; dp[0][1]=0; int s,e,l; scanf("%d",&n); a[0]=1;a[n+1]=1; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=0;i<=n;i++){ for(int j=1;j for(int k=1;k b[k][j]=inf; while(1){ scanf("%d",&s); if(s==0) break; scanf("%d%d",&e,&l); b[s][e]=l; } for(int j=1;j<=a[i+1];j++){ for(int k=1;k<=a[i];k++){ if(dp[i+1][j]>dp[i][k]+b[k][j]&&b[k][j]!=inf) dp[i+1][j]=dp[i][k]+b[k][j]; } } } printf("%d\n",dp[n+1][1]); } int main(void){ int t; scanf("%d",&t); while(t--) data_set(); } Problem C: 计算直线的交点数 #include #include using namespace std; int main() { int n,tmp; set s[0].insert(0); s[1].insert(0); for(int i=2;i<21;i++) { for(int j=0;j { set for(it=s[j].begin();it!=s[j].end();it++) { tmp=*it+(i-j)*j; s[i].insert(tmp); } } } while(cin>>n) { set for(it=s[n].begin();it!=s[n].end();it++) { if(it!=s[n].begin()) cout<<" "; cout<<*it; } cout< } } Problem D: 免费馅饼 #include #include int a[100050][11]; int main() { int i, j, n, p, q, x, m; while(scanf("%d", &n)!=EOF) { if(n==0) break; m=0; memset(a, 0, sizeof(a)); for(i=1;i<=n;i++) { scanf("%d%d", &q, &p); a[p][q]++; if(p>m) m=p; } for(i=m;i>=0;i--) { for(j=0;j<11;j++) { int x=a[i+1][j]; if(j>0&&a[i+1][j-1]>x) x=a[i+1][j-1]; if(j<10&&a[i+1][j+1]>x) x=a[i+1][j+1]; a[i][j]+=x; } } printf("%d\n", a[0][5]); } return 0; } Problem E: 地道战 #include #include const int maxn=110; const int inf=200000000; int n,m,a[maxn][maxn],r[maxn][maxn],d[maxn][maxn]; int min(int a,int b){ return a } void data_set(){ for(int i=1;i<=n;i++) for(int j=1;j scanf("%d",&r[i][j]); for(int i=1;i<=m;i++) for(int j=1;j scanf("%d",&d[j][i]); for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) a[i][j]=inf; } void solve(){ a[1][1]=0; for(int i=2;i<=m;i++) a[1][i]=a[1][i-1]+r[1][i-1]; for(int i=2;i<=n;i++) a[i][1]=a[i-1][1]+d[i-1][1]; for(int i=2;i<=n;i++){ for(int j=2;j<=m;j++){ a[i][j]=min(a[i][j-1]+r[i][j-1],a[i-1][j]+d[i-1][j]); } } printf("%d\n",a[n][m]); } int main() { while(scanf("%d%d",&n,&m)!=EOF){ data_set(); solve(); } } Problem F: 最长不下降序列 #include #include #include using namespace std; const int maxn=2000; int i,j,n,t,x,lmax,a[maxn],b[maxn]; int main(){ int max; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) cin>>a[i]; b[n]=1; lmax=0; for(i=n-1;i>=1;i--){ max=0; for(j=i+1;j<=n;j++) if(a[i]<=a[j]&&b[j]>max) max=b[j]; b[i]=max+1; if(b[i]>lmax) lmax=b[i]; } cout< } return 0; } Problem A: Substrings #include #include #include using namespace std; bool comp(string str1,string str2){ return str1.length() string str[112]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; int i=0; for(i=0;i cin>>str[i]; sort(str,str+n,comp); string::iterator p1; string::iterator p2; string::iterator p0; int ans=0,max=0; for(p1=str[0].begin();p1 string ss1=str[0].substr(p1-str[0].begin(),p2-p1+1); string ss2; for(string::iterator it=p2;it>=p1;it--){ ss2+=*it; } ans=ss1.length(); int flag=1; for(i=1;i int x=str[i].find(ss1); int y=str[i].find(ss2); if(x==-1&&y==-1){ flag=0; break; } } if(flag==1&&max<=ans) max=ans; } cout< } return 0; } ProblemB:Calling Extraterrestrial Intelligcn #include #include #include #define N 100005 using namespace std; bool no_prim[N]; int m,a,b,p,q; void primetable() { int i,j; for(i=3;i<317;i+=2) { if(no_prim[i]==false) { int tmp=i<<1; for(j=i*i;j no_prim[j]=true; } } } int main() { int i,j; primetable(); while(scanf("%d%d%d",&m,&a,&b)&&m&&a&&b) { p=q=0; double limit=a*1.0/b; for(i=2;i<=m;i++) { if(!no_prim[i]&&i%2!=0||i==2) { for(j=2;j<=i&&i*j<=m;j++) { if(!no_prim[j]&&j%2!=0||j==2) { if(j*1.0/i>=limit&&i*j>p*q) //i和j的顺序 { p=j; q=i; } } } } } printf("%d %d\n",p,q); } return 0; } Problem C: 深入浅出学算法028-桥本分数式 #include int main() { int i,k,g,s; int m1,m2,m3,a[10]; a[1]=1;i=1;g=1;s=0; while(1) { g=1; for(k=i-1;k>0;k--) if(a[k]==a[i]) {g=0; break;}