题目链接:http://codeforces.com/problemset/problem/433/A
题目意思:给定 n 个只由100和200组成的数,问能不能分成均等的两份。
题目其实不难,要考虑清楚数量问题即可。就是说,200的数量是奇数或偶数,100的数量是奇数或偶数时的处理。
一开始可能思路有点混乱,学人3分钟打一道题,wa了3次。
由于写得比较混乱,我的代码不好意思贴出来,以下借鉴了别人的两种好的写法。
Time: 31ms Memory: 0KB
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 while (scanf("%d", &n) != EOF) 10 { 11 int tmp, c1, c2; 12 c1 = c2 = 0; 13 for (int i = 0; i < n; i++) 14 { 15 scanf("%d", &tmp); 16 if (tmp == 100) 17 c1++; // c1: 100的数量 18 else 19 c2++; // c2: 200的数量 20 } 21 c2 %= 2; // c2: 0 or 1 22 c1 -= c2 * 2; // 一张c2 = 二张c1 23 if (c1 < 0 || c1 & 1) // c1不是偶数张(不能均分)或者c1只有0张,但c2是奇数张 24 printf("NO "); 25 else 26 printf("YES "); 27 } 28 }
以下这个方法更加直接,不过一定要先排序,还有就是先从200的数量开始分配。
好厉害的写法!!!
Time:15ms Memory: 0KB
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 100 + 5; 8 int a[maxn]; 9 10 int main() 11 { 12 int n, tmp; 13 while (scanf("%d", &n) != EOF) 14 { 15 for (int i = 0; i < n; i++) 16 scanf("%d", &a[i]); 17 sort(a, a+n); 18 int fir = 0, sec = 0; // fir:第一个人分到的apple grams sec:第二个人分到的 19 for (int i = n-1; i >= 0; i--) 20 { 21 if (fir < sec) 22 fir += a[i]; 23 else 24 sec += a[i]; 25 } 26 printf("%s ", fir == sec ? "YES" : "NO"); 27 } 28 return 0; 29 }