http://acm.hdu.edu.cn/showproblem.php?pid=5143
3 1 2 2 1 1 0 0 0 3 0 0 0
Yes No YesHintIn 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}.
/* 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; }