1. 程式人生 > >Codeforces Round #531 (Div. 3)

Codeforces Round #531 (Div. 3)

不會F啊。。。投了。。。剩下的好像都很簡單

A:瞎猜。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     ios::sync_with_stdio(false);
 5     int n;
 6     cin>>n;
 7     if(n%4==0||n%4==3){
 8         cout<<0<<endl;
 9     } else{
10         cout<<1<<endl;
11
} 12 }
View Code

B:隨便搞

#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[6666],ans[6666];
set<int>s[6666];
void cloro(int id,int clo){
    while (s[a[id]].count(clo)){
        clo++;
        if(clo==k+1){
            clo=1;
        }
    }
    ans[id]=clo;
    s[a[id]].insert(clo);
}
int main() { ios::sync_with_stdio(false); cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; int now = 1; bool flag = false; for(int i=1;i<=n;i++){ if(s[a[i]].size()==k){ cout<<"NO"<<endl; exit(0); } cloro(i,now); now
++; if(now==k+1) { now = 1; flag = true; } } if(!flag&&now<k){ cout<<"NO"<<endl; exit(0); } cout<<"YES"<<endl; for(int i=1;i<=n;i++) cout<<ans[i]<<' '; }
View Code

C:傻逼題

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,x,y,a[105];
 4 int dp[100005];
 5 set<int> s;
 6 int main() {
 7     ios::sync_with_stdio(false);
 8     cin>>n>>x>>y;
 9     for(int i=1;i<=n;i++)
10         cin>>a[i];
11     if(x>y){
12         cout<<n<<endl;
13     } else if(x<=y){
14         int num = 0;
15         for(int i=1;i<=n;i++){
16             if(a[i]<=x){
17                 num++;
18             }
19         }
20         int ans = 0;
21         while (num>0){
22             ans++;
23             num-=2;
24         }
25         cout<<ans<<endl;
26     }
27 }
View Code

D:貪心的 六種變換隨便搞

我寫的應該是有問題的,但是ppt了就不想改了,估計會掉。  因為我覺著 我先貪心的 情況會影響到後貪心的。其實加個vis就可以但是我比較懶。。。

#include <bits/stdc++.h>
using namespace std;
string s;int n;
int a[3];
void slove(int c01,int c02,int c10,int c12,int c20,int c21){
    for(int i=n-1;i>=0;i--){
        if(s[i]=='0'){
            if(c02) {
                s[i] = '2';
                c02--;
            }
            else if(c01) {
                s[i] = '1';
                c01--;
            }

        } else if(s[i]=='1'){
            if(c12){
                c12--;
                s[i]='2';
            }
        }
    }
    for(int i=0;i<n;i++){
        if(s[i]=='2'){
            if(c20){
                c20--;
                s[i]='0';
            } else if(c21){
                c21--;
                s[i]='1';
            }
        } else if(s[i]=='1'){
            if(c10){
                s[i]='0';
                c10--;
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin>>n>>s;
    for(int i=0;i<n;i++){
        a[s[i]-'0']++;
    }
    int c01=0,c02=0,c10=0,c12=0,c20=0,c21=0;
    if(a[0]>n/3){
        if(a[1]>n/3){
            c02=a[0]-n/3;
            c12=a[1]-n/3;
        } else{
            c01=n/3-a[1];
            c02=n/3-a[2];
        }
    } else if(a[1]>n/3){
        if(a[2]>n/3){
            c10=a[1]-n/3;
            c20=a[2]-n/3;
        } else{
            c10=n/3-a[0];
            c12=n/3-a[2];
        }
    } else if(a[2]>n/3){
        c20=n/3-a[0];
        c21=n/3-a[1];
    }
    slove(c01,c02,c10,c12,c20,c21);
    cout<<s<<endl;
}
View Code

E:每個數都可以確定一個區間,然後我們求不確定的區間的長度,答案就是 1<<(len-1)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod = 998244353;
 5 int n;int a[200005];
 6 ll qpow(ll a,ll x){
 7     ll res = 1;
 8     while (x){
 9         if(x&1)
10             res=(res*a)%mod;
11         a=(a*a)%mod;
12         x/=2;
13     }
14     return res;
15 }
16 map<int,int> m;
17 vector<int> v [200005];
18 int pre[200005];
19 int main() {
20     ios::sync_with_stdio(false);
21     cin>>n;
22     int id = 1;
23     for(int i=1;i<=n;i++) {
24         cin >> a[i];
25         if(m.count(a[i])){
26             v[m[a[i]]].push_back(i);
27         } else{
28             m[a[i]]=id;
29             v[id].push_back(i);
30             id++;
31         }
32     }
33     for(int i=1;i<id;i++){
34         pre[v[i][0]]++;
35         pre[v[i][v[i].size()-1]]--;
36     }
37     ll cnt = 0;
38     for(int i=1;i<=n;i++){
39         pre[i]+=pre[i-1];
40         if(pre[i]==0)
41             cnt++;
42     }
43     cout<<qpow(2,cnt-1)<<endl;
44 }
View Code

F:狀壓dp。 資料範圍很明顯了。。 先預處理出來每兩行相鄰的時候對答案的貢獻,然後dp,dp的時候列舉第一行是啥。