ACM刷题

来源:互联网 发布:阿里云上海当面核验 编辑:程序博客网 时间:2024/06/07 21:16

1.<杭电1001> calculate SUM(n) = 1 + 2 + 3 + ... + n.

input:The input will consist of a series of integers n, one integer per line.

output:For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will bein the range of 32-bit signed integer.

sample input:

1

100

sample output:

1


5050

code:

#include<stdio.h>int main(){int i,n,sum;while(scanf("%d",&n)!=EOF){sum=0;for(i=0;i<=n;i++)sum+=i;printf("%d\n\n",sum);}return 0; } 
这里要注意防止数值溢出,,避免采用n*(n+1).据网上一段代码:

#include<stdio.h>int main(){int n,sum;while(scanf("%d",&n)!=EOF){if(n%2==0)sum=n/2*(n+1);else sum=(n+1)/2*n; printf("%d\n\n",sum);return 0;}} 


这样似乎可以防止溢出。

2.ASCII排序问题

这里需要注意的是,输入时,需要while(scanf("%c%c%c%c",&a,&b,&c,&d)!=EOF),来抵消掉最后一个换行符!!!

3.while(n--)

   {  scanf("%d %d",&a,&b);    printf("%d\n",a+b);
等同于
for(i=0;i<N;i++){scanf("%d%d",&a,&b);printf("%d\n",a+b);}
4.有时候要注意数据精度,例如杭电2003题,必须要用double类型定义输入数据才行,一个可信服的解释是
应该是计算精度的问题,如果该实数很大的话,用float的话,会出现精度误差。如果内存不是非常紧张,最好还是用double,因为计算机在计算的时候,是用double算的,用float反而要消耗时间去转化

5.字符串比较问题。

题目:Tetrahedron:有4个三角形面

Cube:有6个正方形面

Octahedron:有8个三角形面

Dodecahedron:有12个五边形面

Icosahedron:有20个三角形面(首字母为i的大写)

现在小明有n个正多面体,他想知道这些多面体一共有多少个面

输入说明:第一行为一个整数n(1≤n≤200000),表示正多面体的数量。接下来n行,每一行为正多面体的种类,用上面所给的5个英文字符串表示。注意英文字母大小写是区分的

输出说明:输出总面数

输入样例:

4[EOL] 
Icosahedron[EOL] 
Cube[EOL] 
Tetrahedron[EOL] 
Dodecahedron[EOL]
3[EOL] 
Dodecahedron[EOL] 
Octahedron[EOL] 
Octahedron[EOF] 
输出样例:

42[EOL] 
28[EOF]
程序:

#include<stdio.h>#include<string.h>int main(){int n,i,j;    while(scanf("%d",&n)!=EOF){int sum=0;for(i=0;i<=n;i++){char s[15];gets(s);if(strcmp(s,"Tetrahedron")==0)sum+=4;if(strcmp(s,"Cube")==0)sum+=6;if(strcmp(s,"Octahedron")==0)sum+=8;if(strcmp(s,"Dodecahedron")==0)sum+=12;if(strcmp(s,"Icosahedron")==0)sum+=20;}printf("%d\n",sum);}return 0; } 
注意这里需要用到的字符串比较!

6.组合数问题

训练赛共有n道题目, 其中有m道签到题(能AC的简单题),小明打算从其中任意选出k道题目来做,那么他不爆零的方案数是多少
输入说明:第一行输入一个T, 表示数据组数.下面T组数据, 每组输入三个整数n, m, k。0 < n <= 12, 0 <= m <= n, 0 < k <= n

输出说明:每组输出一个整数表示RBB不爆零的方案数, 每组输出换行.

输入样例:

2[EOL] 
3[SP]1[SP]2[EOL] 
4[SP]2[SP]3[EOF] 
输出样例:

2[EOL] 
4[EOF] 
程序:

#include<stdio.h>int main(){int T,n,m,k;scanf("%d",&T);while(T--){int i,s1=1,s2=1,s;scanf("%d%d%d",&n,&m,&k);if(m==0){printf("0");continue;}for(i=1;i<=k;i++)s1=(s1*(n-k+i))/i;if(n-m>=k)     {for(i=1;i<=k;i++)s2=(s2*(n-m-k+i))/i;}else s2=0; s=s1-s2;printf("%d\n",s);} } 
注意红色部分代码的组合数处理,特别一点是要判断n-m与k大小!

7.最小距离问题

AA特别喜欢蹭饭,所以他没事就去同学家拜访。他有三个朋友,ffppaa,他们三个每人住在自己的屋子里。AA不仅蹭饭,每次辗转于三人的房屋时,还测出ff家到pp家距离a米,ff家到aa家距离b米,pp家到aa家距离c米。

AA不仅喜欢蹭饭,还特别能吃,他每天要吃n顿饭。现在他正在ff家中,准备吃今天的第一顿饭。当然蹭饭也是要有原则的,不能连续在一个朋友家蹭饭。

AA不仅能吃,还特别懒。他要吃n顿饭,还想要走的总路程最小,请你帮他算算最少要走多少米的路程。

程序输入:

第一行为数字n(1<=n<=100)表示要吃的饭的数目。
第二行为ff家到pp家的距离a(1<=a<=100)。
第三行为ff家到aa家的距离b(1<=b<=100)。
第四行为pp家到aa家的距离c(1<=c<=100)。

程序输出一个整数,表示需要走的最小的总路程。
输入样例:

3[EOL] 
2[EOL] 
3[EOL] 
1[EOF] 
输出样例:
3
#include<stdio.h>int main(){int n,a,b,c,s,x;while(scanf("%d",&n)!=EOF){scanf("%d%d%d",&a,&b,&c);if(a<b&&a<c)s=a*(n-1);else if(b<a&&b<c)s=b*(n-1);else if(a==b&&b==c)s=a*(n-1);else if(a==b&&a<c)s=a*(n-1);else if(c<a&&c<b){x=(a<b?a:b);if(n==1)s=0;else if(n==2)s=b;else s=x+(n-2)*c;}printf("%d\n",s);}return 0;} 
不要想复杂,其实超简单的。。。
7.




原创粉丝点击