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;
}