您的位置:首页 > 其它

HDU 5143 NPY and arithmetic progression(思维题)

2015-11-23 23:06 375 查看

NPY and arithmetic progression

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 816 Accepted Submission(s): 262



[align=left]Problem Description[/align]
NPY is learning arithmetic progression in his math class. In mathematics, an arithmetic progression (AP) is a sequence of numbers such that the difference between the consecutive terms is constant.(from wikipedia)

He thinks it's easy to understand,and he found a challenging problem from his talented math teacher:

You're given four integers, a1,a2,a3,a4,
which are the numbers of 1,2,3,4 you have.Can you divide these numbers into some Arithmetic Progressions,whose lengths are equal to or greater than 3?(i.e.The number of AP can be one)

Attention: You must use every number exactly once.

Can you solve this problem?

[align=left]Input[/align]
The first line contains a integer T — the number of test cases (1≤T≤100000).

The next T lines,each contains 4 integers a1,a2,a3,a4(0≤a1,a2,a3,a4≤109).

[align=left]Output[/align]
For each test case,print "Yes"(without quotes) if the numbers can be divided properly,otherwise print "No"(without quotes).

[align=left]Sample Input[/align]

3
1 2 2 1
1 0 0 0
3 0 0 0


[align=left]Sample Output[/align]

Yes
No
Yes
HintIn the first case,the numbers can be divided into {1,2,3} and {2,3,4}.
In the second case,the numbers can't be divided properly.
In the third case,the numbers can be divided into {1,1,1}.


[align=left]Source[/align]
BestCoder Round #22

/*
hdu 5143 暴力枚举
题目大意:
给定数字1,2,3,4.的个数每个数字能且仅能使用一次,组成多个或一个等差数列(长度大于等于3)问能否成功
解题思路:(杭电官方题解)
可以发现等差数列只有(123,234,1234和长度>=3的常数列),如果选择非常数列(123,234,1234)数量大于等于3,
可以变为三个或4个常数列,例如(123,123,123)变为(111,222,333)。所以从0-2枚举选择非常数列的数量,再判断能
否用常数列覆盖剩下的(如果数字长度正好为0或≤3就可以)。
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
bool ok(int a[5])
{
if((a[0]>=3||a[0]==0)&&(a[1]>=3||a[1]==0)&&(a[2]>=3||a[2]==0)&&(a[3]>=3||a[3]==0))
return true;
return false;
}
int a[10],b[10];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0;i<4;i++)
{
scanf("%d",&a[i]);
}
int flag=0;
if(ok(a))
{
flag=1;
}
else
{
for(int i=0;i<=2;i++)
{
for(int j=0;j<=2;j++)
{
for(int k=0;k<=2;k++)
{
b[0]=a[0]-i-j;
b[1]=a[1]-i-j-k;
b[2]=a[2]-i-j-k;
b[3]=a[3]-i-k;
if(ok(b))
flag=true;
}
}
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: