acm入门基础题解一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Problem A: 数字三角形
#include
#include
constintmaxn=110;
int a[maxn][maxn],b[maxn][maxn],n; voiddata_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
constintmaxn=110;
constintinf=200000000;
int a[maxn],b[maxn][maxn],dp[maxn][maxn],n; voiddata_set(){
for(int j=0;j for(int k=0;k dp[k][j]=inf; dp[0][1]=0; ints,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() { intn,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;