Codeforces Round #390 (Div. 2)

22:35~0:35  1.6.2017

 


 

A.Lesha and array splitting

题意:自己看

题解:

构造什么的最弱了

想了想,貌似除了0每个数单独一组就可以,只要有一个非0数则一定可以有解

0的话不停往前找到第一个非0然后合为一组

第一个数是0怎么办?先让第一个数往后找一个非0呗

比赛的时候智商骤减,写的代码好难看还写了好长时间,并且还WA一次...应该可以很简洁的吧

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=105;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}
int n,a[N],f[N],l[N],r[N],k,sum,vis[N];
void solve(){
    k++;
    l[k]=1;r[k]=1;
    if(f[1]!=0){
        for(int i=2;i<=n;i++){
            if(f[i]==0){
                int p=i-1;
                while(f[p]==0) p--;
                if(p<=r[k]) r[k]=i;
                else {k++;l[k]=p;r[k]=i;}
            }
        }
        puts("YES");
        int now=1,cnt=k;
        for(int i=1;i<=n;i++){
            if(l[now]<=i&&i<=r[now]) {if(i==r[now])now++;}
            else cnt++;
        }
        printf("%d\n",cnt);
        now=1;
        for(int i=1;i<=n;i++){
            if(l[now]<=i&&i<=r[now]){
                if(!vis[now]) printf("%d %d\n",l[now],r[now]),vis[now]=1;
                if(i==r[now]) now++;
            }else printf("%d %d\n",i,i);
        }
    }else{
        int p=1;
        while(f[p]==0) p++;//,printf("hi %d %d\n",p,f[p]);
        if(p>n) {puts("NO");return;}
        r[k]=p;
        for(int i=p+1;i<=n;i++){
            if(f[i]==0){
                int p=i-1;
                while(f[p]==0) p--;
                if(p<=r[k]) r[k]=i;
                else {k++;l[k]=p;r[k]=i;}
            }
        }
        puts("YES");
        int now=1,cnt=k;
        for(int i=1;i<=n;i++){
            if(l[now]<=i&&i<=r[now]) {if(i==r[now])now++;}
            else cnt++;
        }
        printf("%d\n",cnt);
        now=1;
        for(int i=1;i<=n;i++){
            if(l[now]<=i&&i<=r[now]){
                if(!vis[now]) printf("%d %d\n",l[now],r[now]),vis[now]=1;
                if(i==r[now]) now++;
            }else printf("%d %d\n",i,i);
        }
    }
    
    
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) a[i]=read(),f[i]=a[i]==0?0:1;
    solve();
}
比赛时的智障代码

相关文章:

  • 2021-11-17
  • 2021-08-12
  • 2021-04-24
  • 2021-12-04
  • 2021-11-19
  • 2021-04-27
  • 2021-08-14
猜你喜欢
  • 2021-12-22
  • 2021-09-30
  • 2021-12-17
  • 2021-08-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案