当前位置: 代码迷 >> 综合 >> ACM赛 CF gym 101341 B Pursuing the Happiness
  详细解决方案

ACM赛 CF gym 101341 B Pursuing the Happiness

热度:25   发布时间:2023-12-06 08:16:52.0

题目: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 200000int 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;
}