【新生请继续猛击】NEW COMER SECOND BLOOD 完全题解及代码

链接: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;
	
}


1007: 计算两点间的距离

解释:应该都记得高中的两点求和公式吧,记得就好,考察了对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;
}



你可能感兴趣的:(【新生请继续猛击】NEW COMER SECOND BLOOD 完全题解及代码)