http://codeforces.com/contest/439/problem/B
水题,因为乘法溢出被hack了。。后来把所有变量都改成了__int64。
#include <stdio.h> #include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #include <queue> #include <string> #define LL long long #define _LL __int64 #define eps 1e-8 using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 110; int main() { _LL n,x; _LL a[100010]; while(~scanf("%I64d %I64d",&n,&x)) { _LL ans = 0; for(int i = 0; i < n; i++) scanf("%I64d",&a[i]); sort(a,a+n); for(int i = 0; i < n; i++) { ans += a[i] * x; if(x > 1) x -= 1; } printf("%I64d\n",ans); } return 0; }http://codeforces.com/contest/439/problem/C
大致题意:
给n个整数,要求把这n个数分成k组,其中有p组每组之和均为偶数,剩下的k-p组每组之和均为奇数。输出这样的分组情况。
思路:可以先分奇数组再分偶数组。要使奇数组分配成功充分条件是奇数个数必须不小于k-p,因为偶数不可能凑成奇数。然后分配偶数组,首先若剩余的奇数个数有奇数个肯定不可以,再者剩余的奇数与偶数凑成的偶数个数必须不小于p,当偶数全分配完后,可以用两个奇数组成一个偶数。当偶数组分配成功后,剩下的奇数和偶数就可以全部放到第一组中。
#include <stdio.h> #include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include <string.h> #include <queue> #include <string> #define LL long long #define _LL __int64 #define eps 1e-8 using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 110; int n,k,p,x; queue <int> Odd,Even; vector <int >ans[100010]; int main() { while(~scanf("%d %d %d",&n,&k,&p)) { int i; for(i = 0; i < k; i++) ans[i].clear(); while(!Odd.empty()) Odd.pop(); while(!Even.empty()) Even.pop(); int odd,even; odd = 0; for(i = 0; i < n; i++) { scanf("%d",&x); if(x & 1) { odd += 1; Odd.push(x); } else { Even.push(x); } } int t = odd - k + p; even = n - odd; if(odd < k-p || t&1 || t/2+even < p) { printf("NO\n"); continue; } printf("YES\n"); for(i = 0; i < k-p; i++) //分配奇数,每组一个, { ans[i].push_back(Odd.front()); Odd.pop(); } for(i = k-p; i < k && !Even.empty(); i++) //分配偶数,每组一个偶数 { ans[i].push_back(Even.front()); Even.pop(); } if(i < k) { //若偶数不够,用两个奇数代替一个偶数 for(; i < k; i++) { ans[i].push_back(Odd.front()); Odd.pop(); ans[i].push_back(Odd.front()); Odd.pop(); } while(!Odd.empty()) { ans[0].push_back(Odd.front()); Odd.pop(); } } else { //剩下的偶数与奇数全放到第0组 while(!Odd.empty()) { ans[0].push_back(Odd.front()); Odd.pop(); } while(!Even.empty()) { ans[0].push_back(Even.front()); Even.pop(); } } for(i = 0; i < k; i++) { printf("%d",ans[i].size()); for(int j = 0; j < (int)ans[i].size(); j++) printf(" %d",ans[i][j]); printf("\n"); } } return 0; }