1. 程式人生 > 實用技巧 >Codeforces Round #668 (Div. 2)A->C

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;    
    }
    
}