acm入门基础题解一

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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[21];

s[0].insert(0);

s[1].insert(0);

for(int i=2;i<21;i++)

{

for(int j=0;j

{

set::iterator it;

for(it=s[j].begin();it!=s[j].end();it++)

{

tmp=*it+(i-j)*j;

s[i].insert(tmp);

}

}

}

while(cin>>n)

{

set::iterator it;

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;

相关文档
最新文档