Codeforces Global Round 10

A.Omkar and Password

题意:给你一个数组,任选一个下标i,并且a[i]!=a[i+1],然后删除a[i]和a[i+1]将a[i]+a[i+1]放到数组中继续操作。当a[i]==a[i+1]操作停止,求停止后的数组长度。

思路:可以发现只要数组中每个数都一样,那么不需要操作了,长度为n,只要数组中出现一个不一样的数,最终操作次数都是1

#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin>>_;
    while(_--)
    {
        int n;
        cin>>n;
        bool flag=false;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(i>0&&a[i]!=a[i-1]&&!flag)
            flag=true;
        }
        if(flag)
        cout<<"1";
        else cout<<n;
        cout<<"\n";
    
    }
	return 0;
 } 

B.Omkar and Infinity Clock

题意:给你一个数组,和一个k,要求k次操作,每次操作选择一个d,为该数组最大值,然后遍历数组a[i]=d-a[i]。求k次操作后打印数组。(1<=k<=1e18)

思路:对数组操作两次后发现最终数组的形态只和k的奇偶性有关

#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin>>_;
    while(_--)
    {
        int n,maxx=-(1e9+5),d=-(1e9+5);
        ll k;
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            maxx=max(a[i],maxx);
        }
        for(int i=0;i<n;i++)
        {
            a[i]=maxx-a[i];
            d=max(d,a[i]);
        }
        if(k&1)
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<" ";
        }
        else 
        {
            for(int i=0;i<n;i++)
            {
                a[i]=d-a[i];
                cout<<a[i]<<" ";
            }
        }
        cout<<"\n";
    }
	return 0;
 } 

C.Omkar and Waterslide

题意:对一个数组a,取高度不递减的任何连续区间,进行+1操作。从右到左保证高度非递增

思路:贪心,我们只需要保证该数组是从左到右非递减就行,对于a[i]>a[i+1]的情况,对答案的贡献就是a[i]-a[i+1]

#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int _;
    cin>>_;
    while(_--)
    {
        int n;
        ll res=0;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=1;i<n;i++)
        if(a[i-1]>a[i])
        res+=a[i-1]-a[i];
        cout<<res<<"\n";
    }
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值