ACM赛 CF gym 101341 B Pursuing the Happiness

题目:Pursuing the Happiness

思路:
刚开始以为要用kmp匹配,一算复杂度发现暴力就够了STO…
假设只有一个串中只有一个“happiness”,交换’a’和’h’即可。
串中有两个“happiness”,交换第一个串’h’和第二个串的’a’。
假设有三个”happiness”,无解。
问题是没有”happiness”时,随机交换两个数可能会产生新的”happiness”,因此我队WA了8次罚时罚死Orz,正确的处理方法是把串中第一个’h’和最末尾的字符交换。同时还要注意没有’h’时只用交换任意两字符。

代码:

#include<bits/stdc++.h>
using namespace std;

#define maxn 200000

int n;
int a[maxn+5]= {0};

int cnt;

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        cnt+=a[i];
    }
    if(cnt>=n) {
        printf("NO\n");
        return 0;
    }
    int m=n;
    for(int i=n; i>=1&&!a[i]; i--) m--;
    if(m==0) {
        printf("YES\n");
        return 0;
    }
    vector<int> ans1,ans2;
    for(int i=n; i>=1; i--) {
        if(a[i]) {
            printf("NO\n");
            return 0;
        }
        if(a[m]) {
            a[m]--;
        } else {
            m--;
            if(m==0) break;
            a[m]--;
        }
        ans1.push_back(m),ans2.push_back(i);
    }
    printf("YES\n");
    for(int i=0; i<ans1.size(); i++) printf("%d %d\n",ans1[i],ans2[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/rabbit_ZAR/article/details/81366494