链接:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=3794
记住,百度永远是你最好的老师,请保证自己有很好的自学能力。
1001:Sum Problem
解释:求1+2+……N的和。不能直接加,会超时,求和公式是一个不错的注意。另外这个数很大,int装不下,需要用到__int64数据方式,用法和INT差不多,不懂的请百度一下。另外注意本体的输出格式,挺坑爹的。
#include <stdio.h> int main() { __int64 a; while(scanf("%I64d",&a)!=EOF) { __int64 b; b=((a+1)*a)/2; printf("%I64d\n",b); printf("\n"); } return 0; }
解释:好多同学是采用的暴力方法,本题解用了欧几里得算法求最大公约数,然后用a*b的和除以最大公约数,方便简洁。欧几里得算法十分优美,还有求逆元等诸多神奇应用,本博客也写了一篇,有兴趣的新生朋友可以看一下。
#include <stdio.h> int gcd(int a,int b)//世界上最经典,最早的算法——欧几里得算法 { if(b==0) return a; return gcd(b,a%b); } int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { int da,result; if(a>=b) da=a; else da=b; result=(a*b)/gcd(a,b); printf("%d\n",result); } return 0; }
解释:很简单的求平均数。但是用double输入的同学请注意,输出时要用%.2f而不是%.2lf,具体我也不知道为啥,主修语言不是C。。
#include <stdio.h> int main() { double result=0,average; double monthmoney; for(int i=0;i<12;i++) { scanf("%lf",&monthmoney); result+=monthmoney; } average=result/12.0; //陷阱,请大家注意额 printf("$%.2f\n",average); //注意输出只有两位小数,另外要用f,为啥我也不知道,C不是主语言 return 0; }
解释:简单比大小,除了英语阅读可能难点,这个题没有理由错。
#include <stdio.h> int main() { int incase; scanf("%d",&incase); for(int i=0;i<incase;i++) { int a,b; scanf("%d%d",&a,&b); if(a<b) printf("NO BRAINS\n"); else printf("MMM BRAINS\n"); } return 0; }
解释:还是比大小,英语阅读题。
#include <stdio.h> bool iftrue(int a,int b,int c) { if((a>b&&a>c&&b>c)||(a<b&&a<c&&b<c)) { return true; } else return false; } int main() { int incase; scanf("%d",&incase); printf("Gnomes:\n"); for(int i=1;i<=incase;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(iftrue(a,b,c)) printf("Ordered\n"); else printf("Unordered\n"); } return 0; }
解释:这个题已经不算是水题,而是简单的模拟题了。。目前AC的少。细节有许多要注意的地方,这里给出了C++写的代码,大家可以对照下并对C++稍微有点认识(提示:cin=scanf,cout=printf,string约等于char [])
#include <iostream> #include <string> using namespace std; void match(string oneaction,string twoaction,int &p1win,int &p2win) { int round=oneaction.length(); for(int i=0;i<round;i++) { if(oneaction[i]=='R') { if(twoaction[i]=='S') p1win++; if(twoaction[i]=='P') p2win++; } if(oneaction[i]=='S') { if(twoaction[i]=='P') p1win++; if(twoaction[i]=='R') p2win++; } if(oneaction[i]=='P') { if(twoaction[i]=='R') p1win++; if(twoaction[i]=='S') p2win++; } } } int main() { string oneaction,twoaction; while(cin>>oneaction>>twoaction && (oneaction!="E"&&twoaction!="E")) { int p1win=0; int p2win=0; match(oneaction,twoaction,p1win,p2win); cout<<"P1: "<<p1win<<endl; cout<<"P2: "<<p2win<<endl; } return 0; }
解释:应该都记得高中的两点求和公式吧,记得就好,考察了对MATH函数的用法。
#include <stdio.h> #include <cmath> int main() { double x1,y1,x2,y2; while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2) != EOF) { double result; result=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); printf("%.2f\n",result); } return 0; }