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; }
相关文章推荐
- 文字检测与识别2-字符过滤
- easyui datagrid 动态生成列
- 大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》1.1基于TCP协议的RPC
- 一个带动画特效的beamer
- CentOS 6.5安装配置LNMP服务器(Nginx+PHP+MySQL)
- aspx.cs上传文件
- Adapter Pattern——Head First Design Pattern
- 源码BaseAdapter浅谈
- fetch = FetchType.EAGER 作用
- 敏捷开发-故事与估算
- leetcode刷题记录-Two Sum
- 判断一个单向链表中是否有环
- ubuntu搜狗输入法安装
- 优秀博客_Android
- caffe使用python创建lmdb
- SQL语句优化技术分析
- Redis入门
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- 实时天气接口
- 系统版本