Codeforces Round #668 (Div. 2)A->C

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

解析:

倒序输出即可。

#include<bits/stdc++.h>
#include<map>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e2+10;
const int maxn2=1e9+10;
const int mod=1e9+10;
int a[maxn];
struct node
{
    int x1,y1,x2,y2;
}st[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        
                for(int i=n;i>=1;i--)
            cout<<a[i]<<" ";
            cout<<endl;    


    }
    
}

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

题意:

给出长度为n的数组,和为0

操作:

i  j

-1  +1  免费

j  i

+1  -1  花费1

求最少操作数,使得所有数字变为0

解析:

从前往后,累加正数,每次遇到负数,就进行抵消。

如果这个负数抵消完以后,依然<0,那么操作数就是它的绝对值。

因为总和为0,那么一系列抵消以后,如果还剩有负数,那么它们其后一定存在正数,所以负数的绝对值和就是答案。

#include<bits/stdc++.h>
#include<map>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int maxn2=1e9+10;
const int mod=1e9+10;
ll a[maxn];
struct node
{
    int x1,y1,x2,y2;
}st[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        ll sum = 0 ;
        ll cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>=0)
                sum+=a[i];
            else
            {
                sum+=a[i];
                if(sum<0)
                {
                    cnt-=sum;
                    sum=0;
                }
            }
        }
        cout<<cnt<<endl;
    }
    
}

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

题意:

长度为n的字符串,?可以变成0或1

是否能使所有k长的子字符串,其中的0,1的数目相同

解析:

由此可见,之间的字符为公用,那么要想保证条件,则要满足si==si+k....

有结论,Si=Si%k

那么,从i=k开始,如果s[i]=='?',那么直接默认它改成了和s[i%k]一样

如果s[i]==s[i%k],已满足条件,继续。

以上两个条件都不满足,如果s[i+k]为'?',就对其做出改变,否则不合法。

以上的操作,实际上都是对s0~sk-1的复制操作。

所以只要检查一遍s0~sk-1,即可

#include<bits/stdc++.h>
#include<map>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int maxn2=1e9+10;
const int mod=1e9+10;
ll a[maxn];
struct node
{
    int x1,y1,x2,y2;
}st[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        int ok =0;
        for(int i=k;i<n;i++)
        {
            if(s[i]=='?'||s[i]==s[i%k])
                continue;
            if(s[i%k]=='?')
                s[i%k]=s[i];
            else
                {
                    ok=1;break;
                }
        }
        int c1=0,c0=0;
        for(int i=0;i<k;i++)
        {
            if(s[i]=='1')
                c1++;
            else if(s[i]=='0')
                c0++;
        }
        if(c1>(k/2)||c0>(k/2)||ok==1)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;    
    }
    
}
原文地址:https://www.cnblogs.com/liyexin/p/13634493.html