【CF 1042】 Round #510 (Div. 2)

本文提供了CodeForces比赛1042题的解题思路及代码实现,包括A题的排序更新最大值策略、B题的暴力求解最小组合费用问题、C题的模拟操作解决负数乘法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下自己的丑代码。D题还不会,看别人代码也不懂,虽然就十来行。。日后再补

A:http://codeforces.com/contest/1042/problem/A

/*
* @Author: SamsonHo
* @Date:   2018-09-17-16.04.25
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int a[105];
int main(void)
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        int Max = a[n]+m;
        int pos = 1;
        for(int i = 1; i < n; ++i)
        {
            if(a[n] == a[i])    break;
            if(m > a[n]-a[i])
            {
                m -= a[n]-a[i];
                a[i] = a[n];
            }
            else
            {
                a[i] += m;
                m = 0;
                break;
            }
        }
        if(m)
        {
            printf("%d %d\n",a[1]+m/n+(m%n!=0), Max);
        }
        else
        {
            printf("%d %d\n",a[n], Max);
        }

    }
}

B:http://codeforces.com/contest/1042/problem/B

B的代码就更丑了,当时没想到怎么做,只能暴力敲一下了。

/*
* @Author: SamsonHo
* @Date:   2018-09-17-16.25.55
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
//struct juice
//{
//    int v,a,b,c;
//}ju[1005];
//bool cmp(juice x,juice y)
//{
//    return x.v < y.v;
//}
int a[11],v;
//a b c ab  ac bc abc;
//1 3 5  4  6   8  9
int main(void)
{
    int n;
    char str[5];
    while(~scanf("%d",&n))
    {
        for(int i = 0; i < 10; ++i)
            a[i] = 300005;
        int tmp;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d%s",&v,str);
            tmp = 0;
            for(int j = 0; str[j]; ++j)
            {
                if(str[j] == 'A')
                    tmp += 1;
                else if(str[j] == 'B')
                    tmp += 3;
                else if(str[j] == 'C')
                    tmp += 5;
            }
            if(v < a[tmp])
                a[tmp] = v;
        }
        int ans = 300005;
        ans = min(ans,a[1]+a[3]+a[5]);
        ans = min(ans,a[4]+a[5]);
        ans = min(ans,a[6]+a[3]);
        ans = min(ans,a[8]+a[1]);
        ans = min(ans,a[9]);
        ans = min(ans,a[4]+a[6]);
        ans = min(ans,a[4]+a[8]);
        ans = min(ans,a[6]+a[8]);
        if(ans == 300005)
            puts("-1");
        else
            printf("%d\n",ans);
    }
}

C:http://codeforces.com/contest/1042/problem/C

C的话也是模拟做了一下,想到正数的话就直接乘就好了,但是要优先处理负数,两个负数相乘可以变正数,所以偶数个就直接两两相乘就消化掉了,奇数个的情况下如果有0存在,可以和0相乘就消去一个值最大的负数,剩下的还是两两相乘。第二步再处理0,一直进行操作1到只剩一个。再把剩下的那个2操作消灭掉。但是还有个情况就是0 0 0 这样的,最后剩的那个0不能消掉。

啊,情况好多,这种办法赛场上要不是没思路真的不想碰运气……

/*
* @Author: SamsonHo
* @Date:   2018-09-17-16.47.41
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 2e5+10;
vector<int> zero;
vector<int> z;
vector<int> f;
int a[MAXN],s0;
bool cmp(int x,int b)
{
    return a[x] > a[b];
}
void dealzero()
{

}
int main(void)
{
    int n;
    while(~scanf("%d",&n))
    {
        zero.clear();
        z.clear();
        f.clear();
        int cnt = 0;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d",&a[i]);
            if(a[i] == 0)
                zero.push_back(i);
            else if(a[i] > 0)
                z.push_back(i);
            else
                f.push_back(i);
        }
        s0 = zero.size();
        int sf = f.size();
        int ff = 0;
        if(sf % 2 == 1)
        {
            ff = 1;
            sort(f.begin(),f.end(),cmp);
            if(s0 > 0)
                printf("1 %d %d\n",f[0],zero[0]);
            else
                printf("2 %d\n",f[0]);
            for(int i = ff+1; i < sf; ++i)
            {
                printf("1 %d %d\n",f[i],f[ff]);
            }
            --sf;
        }
        else if(sf % 2 == 0)
        {
            for(int i = 1; i < sf; ++i)
            {
                printf("1 %d %d\n",f[i],f[0]);
            }
        }
        if(s0 >= 1)
        {
            int len = zero.size();
            for(int i = 1; i < len; i++)
                printf("1 %d %d\n",zero[i],zero[0]);

        }
        int sz = z.size();
        for(int i = 1; i < sz; ++i)
        {
            printf("1 %d %d\n",z[i],z[0]);
        }
        if(sf && sz)
            printf("1 %d %d\n",f[ff],z[0]);
        if((sf || sz) && s0)
            printf("2 %d\n",zero[0]);
    }
}

D:http://codeforces.com/contest/1042/problem/D

待补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值