2021ICPC网络赛(第二场)

本文探讨了编程竞赛中如何构建满足特定条件的集合策略,并提供了C++代码实现。同时,介绍了数值计算的处理方法,包括从低位到高位的逐位相加减,以及进位的分类讨论。这两部分内容结合,展示了在编程竞赛和算法实现中的问题解决思路。

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

2021ICPC网络赛(第二场)

H.

分析:
  • 两个条件:

    • 任意 rrr 个的并集 >=128>=128>=128
    • 每一个构造的集合长度 <=∣512r∣<=|\frac{512}{r}|<=r512(向上取整)
  • 构造方法:将 256256256 拆分成 kkk 段,d=256/kd=256/kd=256/k

    ddd 段长度设置起点 ststst ,在接下来的长度 lenlenlen111 去覆盖

  • 大坑点256%k256\%k256%k 的多余的部分不能全部留给最后一段,要均分(每段最多分到 111 ),所以 ststst 还要判断一下

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main()
{
    int k,r;
    cin>>k>>r;
    int len=ceil(512/r), d=256/k;
    /*if(2*(r-1)*k+4*r<k*r)
    {
        cout<<"-1"<<endl; return 0;
    }*/ // 赛后跟队友讨论了一下,发现不存在“-1”的情况
    int st=0, yu=256%k;
    for(int i=1;i<=k;i++)
    {
        int t=len;
        //if(yu) t++; 均不均分跟len没有关系
        for(int j=1;j<=256;j++)
        {
            if((j>st || 256-st+j<=len) && t)
            {
                cout<<"1"; t--;
            }
            else cout<<"0";
        }
        cout<<endl;
        st+=d;
        if(yu) { st++; yu--; }
    }
    return 0;
}

M.

分析:
  • 从最低位到高位,依次相加减,分类讨论进位的多种情况
#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int p[N], a[N], b[N], c[N];
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>p[i];
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    int fp=0; // 表示进位
    for(int i=1;i<=n;i++)
    {
        fp*=p[i]; // 进位加到当前位,同号相加,不变,异号相减
        int t=a[i]+b[i]+fp;
        if(t==0 || t==1) { c[i]=t; fp=0; }
        else if(t==-1) { c[i]=1; fp=-1; }
        else if(t==2) { c[i]=0; fp=1; }
        else if(t==3) { c[i]=1; fp=1; }
        fp*=p[i]; // 当前位进到下一位,若当前的 sgn 是 -1 那进到下一位还要取反
    }
    for(int i=1;i<n;i++) cout<<c[i]<<' ';
    cout<<c[n]<<endl;
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yezzz.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值