【Best Coder】Baby Ming and phone number(水)

Baby Ming and phone number

 
 Accepts: 243
 
 Submissions: 565
 Time Limit: 3000/1500 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
铭宝宝收集了很多手机号码,没错,他想卖手机号码赚钱。
他觉得有如下性质的手机号码可以卖aa元钱,其他的号码,只能卖bb元钱。
1.末5位数字相同(比如123-4567-7777)
2.末5位是连续递增或者连续递减的,且相邻数位相差1的数(比如188-0002-3456)
3.末8位是一个表示日期的数字,并且表示的日期在1980年1月1日至2016年12月31日内(比如188-1888-0809表示1888年8月9日)
铭宝宝想知道卖掉所有的手机号码能赚多少钱。
输入描述
输入T(T \leq 30)T(T30)表示TT组测试数据
输入n(n \leq 100,000)n(n100,000)表示铭宝宝有nn张手机号码(没有相同的手机号码)
输入22个正整数a, ba,b, 表示两种类型的手机号码分别能卖aa元和bb(b \leq 1000, a \leq 100,000)(b1000,a100,000)
接下去nn行,每行输入11个手机号码(|phonenumber|==11,首位非0)
输出描述
输出答案
输入样例
1
5
100000 1000
12319990212
11111111111
22222223456
10022221111
32165491212
输出样例
302000


读懂题去比较就行了,不是很难的。

代码如下:

#include <stdio.h>
#include <string.h>
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool run(int y)
{
	if ((y%400==0) || (y%4==0 && y%100!=0))
		return true;
	return false;
}
char a[11];			//	1234 56 789 10 11
bool check1()		//	0123 45 678 9  10
{
	for (int i=9;i>=6;i--)
	{
		if (a[i]!=a[10])
			return false;
	}
	return true;
}
bool check2()
{
	int dot=0;
	for (int i=10;i>=7;i--)
	{
		if (a[i]==a[i-1]+1)
			dot++;
	}
	if (dot==4)
		return true;
	for (int i=10;i>=7;i--)
	{
		if (a[i]!=a[i-1]-1)
			return false;
	}
	return true;
}
bool check3()
{
	int y,m,d;
	y=(a[3]-'0')*1000+(a[4]-'0')*100+(a[5]-'0')*10+a[6]-'0';
	m=(a[7]-'0')*10+a[8]-'0';
	d=(a[9]-'0')*10+a[10]-'0';
	if (m==2 && run(y))
		d--;
	if (y>=1980 && y<=2016 && m>=1 && m<=12 && d<=day[m])
		return true;
	return false;
}
int main()
{
	int u;
	int n;
	int m1,m2;
	int ans;
	scanf ("%d",&u);
	while (u--)
	{
		scanf ("%d",&n);
		scanf ("%d %d",&m1,&m2);
		ans=0;
		for (int i=1;i<=n;i++)
		{
			scanf ("%s",a);
			if (check1() || check2() || check3())
				ans+=m1;
			else
				ans+=m2;
		}
		printf ("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(【Best Coder】Baby Ming and phone number(水))