Deltix Round, Spring 2021 (Div. 1 + Div. 2)2021.05.30

Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)

闲话:这场比赛又是心态场,签到完A之后以及半个多小时了,实属是慌,自以为是做不出来的了,反而跑去干别的(水群),后来想着破罐子破摔,没想到bc居然那么简单,最后是切完b,c还没提交了over了。所以说还是那句话,还没有结束千万别放弃。(就像校赛的数位dp,在结束前二十分钟切掉。)

A. Game of Life

题意

A
意思是给一段01序列和数字k,可以进行k次操作,每次操作可以把所有相邻两边只有一个1的那个0变成1.输出最后结果。

题解

模拟即可。

code

using namespace std;
const int N=1e3+33;
char a[N],b[N];
int main()
{
    IOS
    int t;cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        int all=0;
        memset(a,'0',sizeof a);
        memset(b,'0',sizeof b);
        for(int i=1;i<=n;i++){
            char d;
            cin>>d;
            b[i]=a[i]=d;
            if(a[i]=='0')all++;
        }
        for(int j=0;j<m&&j<all;j++){
            for(int i=1;i<=n;i++)a[i]=b[i];
            for(int p=1;p<=n;p++){
                int now=0;
                if(a[p-1]=='1')now++;
                if(a[p+1]=='1')now++;
                if(a[p]=='0'&&now==1)b[p]='1';
            }
        }
        for(int i=1;i<=n;i++){
            cout<<b[i];
        }
        cout<<'\n';
    }
    return 0;
}

B. Lord of the Values

题意

B
给一段数列长为m,要通过n次操作把所有数变相反数。操作是指:

  1. 选i,j。i<j
  2. 操作1:a[i]=a[i]+a[j]
  3. 操作2:a[j]=a[j]-a[i]

n不必最小化,并且数列数量为偶数

题解

数列数量为偶数,于是我们发现有通解。
任选a[i],a[j]。进行以下操作:

0   a[i]              a[j]
1   a[i]+a[j]         a[j]
2   a[i]+a[j]         -a[i]
2   a[i]+a[j]         -2*a[i]-a[j]
1   -a[i]             -2*a[i]-a[j]
2   -a[i]             -a[i]-a[j]
2   -a[i]             -a[j]

于是我们可以两两配对进行操作。
没对是6次,总共是m/2*6,并不会超出答案限制。

code

using namespace std;
const int N=1e3+33;
char a[N],b[N];
int main()
{
    IOS
    int t;cin>>t;
    while(t--){
        int n;
        cin>>n;
        int d;
        for(int i=1;i<=n;i++)cin>>d;
        int mid=n/2;
        cout<<n/2*6<<'\n';
        for(int i=1;i<=mid;i++){
            cout<<1<<' '<<i<<' '<<i+mid<<'\n';
            cout<<2<<' '<<i<<' '<<i+mid<<'\n';
            cout<<2<<' '<<i<<' '<<i+mid<<'\n';
            cout<<1<<' '<<i<<' '<<i+mid<<'\n';
            cout<<2<<' '<<i<<' '<<i+mid<<'\n';
            cout<<2<<' '<<i<<' '<<i+mid<<'\n';
        }
        cout<<'\n';
    }
    return 0;
}

C. Compression and Expansion

题意

C
看题很难看出来,不妨看看样例
样例
发现输入的是标题末尾数字,要将完整标题输出。

通解

一道模拟题。当我们发现当前是1时,就得在原有标题后面再多一级标题,若当前是结尾+1说明是同级标题的下一列,否者说明当前应该是上级标题,那么我们就循环往前推,知道发现一个标题等于当前减一,也就是当前应该放的同级位置,将其替换上去即可。

code

using namespace std;
typedef long long ll;
inline ll read()
{
    ll x=0,flag=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') flag=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<1)+(x<<3)+c-'0';
        c=getchar();
    }
    return x*flag;
}
ll a[1005];
ll ans[1005];
int main()
{
    ll t=read();
    while(t--)
    {
       ll n=read();
       for(int i=1;i<=n;i++)
       {
           a[i]=read();
       }
       printf("1\n");
       ll len=1;
       ans[1]=1;
       for(int i=2;i<=n;i++)
       {
           if(a[i]==1)
           {
               ans[++len]=1;
           }
           else
           {
               while(a[i]!=ans[len]+1)
               {
                   len--;
               }
               ans[len]=a[i];
           }
           for(int j=1;j<len;j++)
           {
               printf("%lld.",ans[j]);
           }
           printf("%lld\n",ans[len]);
       }
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值