Codeforces Round 990 (Div. 2)(A-D)

题目链接:Dashboard - Codeforces Round 990 (Div. 2) - Codeforces

A. Alyona and a Square Jigsaw Puzzle

思路

一层一层的围起来,可以发现边长是1 3 5 7 9....,预处理一下,当总数能够到达构成的条件cnt++

代码

#include
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector
#define vb vector
typedef pair pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

map mp;

void solve(){
    int n;
    cin>>n;
    vi a(n+10);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }   
    int cnt=0;
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=a[i];
        if(mp[sum]) cnt++;
    }
    cout<>_;
    while(_--) {
        solve();
    }
    return 0;
}

B. Replace Character

思路

将出现次数最少的字符中的一个换成出现最多的字符,这样就能保证它所构成的排列最少(注意最少和最多相等的时候 有不同的要换成不同的)

代码

#include
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector
#define vb vector
typedef pair pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

void solve(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    map mp;
    for(int i=0;ict){
            mi=ct;
            cc=ch;
        }
    }
    for(int i=0;i>_;
    while(_--) {
        solve();
    }
    return 0;
}

C. Swap Columns and Find a Path

思路

题意表示可以任意排序,那么就让答案加上每一列最大的那个,然后最后再加上没有选择的数中最大的那个

代码

#include
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector
#define vb vector
typedef pair pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

struct node{
    int fi,se;
};

void solve(){
    int n;
    cin>>n;
    vector a(n+10);
    for(int i=1;i<=n;i++){
        cin>>a[i].fi;
    }
    for(int i=1;i<=n;i++){
        cin>>a[i].se;
    }

    if(n==1){
        cout<a[i].se){
            b[i]=a[i].se;
            sum+=a[i].fi;
        }else{
            b[i]=a[i].fi;
            sum+=a[i].se;
        }
    }
    sort(b.begin()+1,b.begin()+1+n);
    cout<>_;
    while(_--) {
        solve();
    }
    return 0;
}

D. Move Back at a Cost

思路

可以发现无论怎么操作每个数最多就+1就能完成排序,考虑当这个数的后面有比它小的数那就让它+1,当这个数的前面有(+1的数)那么(+1的数)就跑到这个数的后面,如果这个(+1的数)比这个数还要小,那么这个数就+1;

简而言之,如果这个数后面有比这个数小的数此数+1,否则如果这个数前面已经+1的数有比这个数小的,此数+1;

最后将处理完的数排序后输出

代码

#include
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector
#define vb vector
typedef pair pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;


void solve(){
    int n;
    cin>>n;
    vi a(n+10);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    vi fmi(n+10,INF);
    for(int i=n-1;i>=1;i--){
        fmi[i]=min(fmi[i+1],a[i+1]);
    }

    int mi=INF;
    for(int i=1;i<=n;i++){
        if(a[i]>fmi[i]){
            a[i]++;
            mi=min(mi,a[i]);
        }else{
            if(a[i]>mi){
                a[i]++;
            }
        }
    }
    sort(a.begin()+1,a.begin()+1+n);
    for(int i=1;i<=n;i++){
        cout<>_;
    while(_--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(算法,数据结构,c++,贪心算法,动态规划)