Codeforces Round #752 (Div. 2) ABCD

Problem - A - Codeforces

题目大意:整数序列a1,a2,…an。可以执行以下操作任意次(可能是零次):
选择任意正整数k(在不同的操作中可以不同)。
选择序列中的任何位置(可能是序列的开头或结尾,或者在任意两个元素之间),并在该位置将k插入序列。
这样,序列a改变,并且对该改变的序列执行下一操作。
例如,如果a=[3,3,4]并且他选择k=2,则在运算之后,他可以获得序列[2-,3,3,4]、[3,2-,3,4]、[3,3,2-,4]或[3,3,4,2-]中的一个。
要求这个序列满足:对于每个1≤i≤|a|,ai≤i,这里,|a|表示a的大小。
帮助找到实现这一目标所需执行的最少操作次数。

input

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

output

1
3
0
696966
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int a[200200];
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]>i+flag) flag+=a[i]-(i+flag);
        }
        cout<<flag<<endl;
    }
    return 0;
}

Problem - B - Codeforces

一直读不懂题,我人麻了,请教苏佬才懂。QAQ

题目大意:给定一个序列a,你可以把它分成若干份,对于每一份,定义h k为该序列的最长上升子序列,问是否存在划分方法使得h1,h2,h3......h k异或为0?

异或:相同为0,不同为1

0^0=0    0^1=1    1^0=1   1^1=0

 思路:当n为偶数个的时候一个一个划分直接异或为0;

当n为奇数个的时候,如果能够消掉一个数(a[i-1]>=a[i],这两为一组,那么它的最长上升子序列被判为1个),这样就变成了偶数个。

input

4
7
1 3 4 2 2 1 5
3
1 3 4
5
1 3 2 4 2
4
4 3 2 1

output

YES
NO
YES
YES
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int a[200200];
        for(int i=1;i<=n;i++)
            cin>>a[i];
        if(n%2==0) cout<<"YES"<<endl;
        else
        {
            bool flag=false;
            for(int i=1;i<=n;i++)
                if(a[i-1]>=a[i]) { flag=true; break; }
            if(flag==true) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
    return 0;
}

Problem - C - Codeforces

a不能被b整除的意思是b%a!=0

题目大意:有整数序列a1,a2……An.  将执行以下操作,直到序列变为空:选择索引i,使得1≤i≤|a|和ai不能被(i+1)整除,并从序列中删除该元素。注意,序列A改变,并且对该改变的序列执行下一操作。
例如,如果a=[3,5,4,5],则他可以选择i=2,因为a2=5不能被i+1=3整除。在此操作之后,序列是[3,4,5]。
帮助确定是否可以使用上述操作擦除整个序列。

input

5
3
1 2 3
1
2
2
7 7
10
384836991 191890310 576823355 782177068 404011431 818008580 954291757 160449218 155374934 840594328
8
6 69 696 69696 696969 6969696 69696969 696969696

output

YES
NO
YES
YES
NO

c比b好写多了,题意容易读懂。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int a[200200],b[200200]={0};
        for(int i=1;i<=n;i++)
            cin>>a[i];
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]%(i+1)!=0) sum++;
            else
            {
                bool flag=false;
                for(int j=i;j>=(i+1-sum);j--)
                    if(a[i]%j!=0) { flag=true; sum++; break; }
                if(flag==false) break;
            }
        }
        if(sum==n) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

Problem - D - Codeforces

题目大意:两个偶数x和y,找出一个正整数n,1 ≤ n ≤ 2*10的18次方,需要满足n%x=y%n

如果有多个这样的整数,则输出any。

input

4
4 8
4 2
420 420
69420 42068

output

4
10
420
9969128

可明显发现,等式两边的余数就是y mod x  

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long int x,y;
        scanf("%lld %lld",&x,&y);
        if(x>y) printf("%lld\n",x+y);
        else if(x==y) printf("%lld\n",x);
        else if(x<y) printf("%lld\n",y-(y%x)/2);
    }
    return 0;
}

一开始wa在x<y时,我直接输出了(x+y)/ 2 。

它说我没有给出最优答案,我寻思着这题难道不是随便输出合法的就行了嘛???(· ·)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vijurria

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

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

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

打赏作者

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

抵扣说明:

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

余额充值