链接: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;
}
1002: 最小公倍数
解释:好多同学是采用的暴力方法,本题解用了欧几里得算法求最大公约数,然后用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;
}
1003: Financial Management
解释:很简单的求平均数。但是用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;
}
1004: No Brainer
解释:简单比大小,除了英语阅读可能难点,这个题没有理由错。
#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;
}
1005: Gnome Sequencing
解释:还是比大小,英语阅读题。
#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;
}
1006: Rock, Paper, Scissors
解释:这个题已经不算是水题,而是简单的模拟题了。。目前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;
}