CF 251

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值