• CDQZ_Training 20120524 词编码


    http://cdqz.openjudge.cn/noip/1009/

    时间限制:
    10000ms
    内存限制:
    128000kB
    描述
    输入
    N和转换后的单词,每个单词占一行。单词数不大于2001.不会有其它任何东西,除了一些空格与空行
    输出
    你的程序应该打印输出原始序列的词,注意换行。
    若有多解,操作4优先,不行则按操作1,2,3优先。同一操作,按操作位置最先的优先。同一操作,按操作位置最先的优先(从左到右数起l,2,3,…N),还有操作2时,被删数列,先在被删数列添0,不行再添l。
    如果没答案输出-1
    样例输入
    4
    0000
    011
    1011
    11011
    样例输出
    0000
    0110
    1001
    1111
     
    题解:
      这道题是URAL1007的原题,直接模拟即可。在几个需要移动的操作用前缀和优化即可。
     
    View Code
      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 
      5 using namespace std;
      6 
      7 const int maxn=2000;
      8 
      9 int n,num[maxn];
     10 
     11 char s[maxn];
     12 
     13 bool check1(char *s)
     14 {
     15     int l=strlen(s+1);
     16     if (l!=n) return false;
     17     int sum=0;
     18     for (int a=1;a<=n;a++)
     19         if (s[a]=='1') sum+=a;
     20     for (int a=1;a<=n;a++)
     21     {
     22         if (s[a]=='1')
     23         {
     24             sum-=a;
     25             if (sum % (n+1)==0)
     26             {
     27                 s[a]='0';
     28                 printf("%s\n",s+1);
     29                 return true;
     30             }
     31             sum+=a;
     32         }
     33     }
     34     return false;
     35 }
     36 
     37 bool check2(char *s)
     38 {
     39     int l=strlen(s+1);
     40     if (l!=n-1) return false;
     41     int fs=0;
     42     for (int a=1;a<=l;a++)
     43     {
     44         num[a]=num[a-1];
     45         if (s[a]=='1') num[a]++,fs+=a;
     46     }
     47     for (int a=1;a<=n;a++)
     48     {
     49         fs+=num[l]-num[a-1];
     50         if (fs % (n+1)==0)
     51         {
     52             for (int b=1;b<a;b++)
     53                 printf("%c",s[b]);
     54             printf("0");
     55             for (int b=a;b<=l;b++)
     56                 printf("%c",s[b]);
     57             printf("\n");
     58             return true;
     59         }
     60         fs+=a;
     61         if (fs % (n+1)==0)
     62         {
     63             for (int b=1;b<a;b++)
     64                 printf("%c",s[b]);
     65             printf("1");
     66             for (int b=a;b<=l;b++)
     67                 printf("%c",s[b]);
     68             printf("\n");
     69             return true;
     70         }
     71         fs-=a+num[l]-num[a-1];
     72     }
     73     return false;
     74 }
     75 
     76 bool check3(char *s)
     77 {
     78     int l=strlen(s+1);
     79     if (l!=n+1) return false;
     80     int sum=0;
     81     for (int a=1;a<=l;a++)
     82     {
     83         num[a]=num[a-1];
     84         if (s[a]=='1') sum+=a,num[a]++;
     85     }
     86     for (int a=1;a<=l;a++)
     87     {
     88         sum-=num[l]-num[a];
     89         if (s[a]=='1') sum-=a;
     90         if (sum % (n+1)==0)
     91         {
     92             for (int b=1;b<a;b++)
     93                 printf("%c",s[b]);
     94             for (int b=a+1;b<=l;b++)
     95                 printf("%c",s[b]);
     96             printf("\n");
     97             return true;
     98         }
     99         sum+=num[l]-num[a];
    100         if (s[a]=='1') sum+=a;
    101     }
    102     return false;
    103 }
    104 
    105 bool check4(char *s)
    106 {
    107     int l=strlen(s+1);
    108     if (l!=n) return false;
    109     int sum=0;
    110     for (int a=1;a<=l;a++)
    111         if (s[a]=='1') sum+=a;
    112     if (sum % (n+1)==0)
    113     {
    114         printf("%s\n",s+1);
    115         return true;
    116     }
    117     return false;
    118 }
    119 
    120 int main()
    121 {
    122     scanf("%d",&n);
    123     while (~scanf("%s",s+1))
    124     {
    125         bool able=false;
    126         able=check4(s);
    127         if (able) continue;
    128         able=check1(s);
    129         if (able) continue;
    130         able=check2(s);
    131         if (able) continue;
    132         able=check3(s);
    133         if (able) continue;
    134         printf("-1\n");
    135     }
    136 
    137     return 0;
    138 }
  • 相关阅读:
    WisDom .net开发框架设计 2
    多线程处理大数组
    C#核心语法
    怎样控制与复制相同的功能
    SQL 内存数据库的细节
    验证编辑方法(Edit method)和编辑视图(Edit view)
    上传图片检测其是否为真实的图片 防范病毒上传至服务器
    chrome切换hosts插件 hostsadmin
    程序托盘图标+右键弹出菜单
    30多年程序员生涯经验总结(成功源自于失败中的学习;失败则是因为容忍错误的横行)
  • 原文地址:https://www.cnblogs.com/zhonghaoxi/p/2518497.html
Copyright © 2020-2023  润新知