• csu


    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536

    不知道为何怎么写都写不对.

    这题可以模拟.

    虽然题目保证一定可以从原串变成目标串,但是不一定可以变成两种目标串.

    所以需要判断下.统计原串中0和1的个数,然后计算目标串中0可能的个数,1可能的个数.

    计算交换次数就是从后面找一个跟当前不一样的数字交换到前面来即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<stdlib.h>
     6 #include<algorithm>
     7 using namespace std;
     8 const int MAXN=20;
     9 int a[MAXN],b[MAXN],num[MAXN],temp[MAXN],ans;
    10 int main()
    11 {
    12     //freopen("a.txt","r",stdin);
    13     int n,m,num0=0,num1=0,res1=0,res2=0;
    14     int minn=0x3f3f3f3f;
    15     scanf("%d %d",&n,&m);
    16     for(int i=1; i<=n; i++)
    17     {
    18         scanf("%d",&a[i]);
    19         if(a[i]==1) num1++;
    20         if(a[i]==0) num0++;
    21     }
    22     // printf("%d %d
    ",num1,num0);
    23     for(int i=1; i<=m; i++)
    24     {
    25         scanf("%d",&temp[i]);
    26         if(i%2==1) res1+=temp[i];
    27         if(i%2==0) res2+=temp[i];
    28     }
    29     //printf("%d %d
    ",res1,res2);
    30     if(res1==num1)
    31     {
    32         ans=0;
    33         memset(b,0,sizeof(b));
    34         int flag=1,cnt=1;
    35         for(int i=1; i<=m; i++)
    36         {
    37             for(int j=1; j<=temp[i]; j++)
    38                 b[cnt++]=flag;
    39             flag=!flag;
    40         }
    41         for(int i=1; i<=n; i++)
    42         {
    43             if(a[i]==b[i]) continue;
    44             else
    45             {
    46                 for(int j=i+1; j<=n; j++)
    47                 {
    48                     if(b[j]==!b[i])
    49                     {
    50                         swap(b[j],b[i]);
    51                         ans+=j-i;
    52                         break;
    53                     }
    54                 }
    55             }
    56         }
    57         minn=min(ans,minn);
    58     }
    59     if(res1==num0)
    60     {
    61         ans=0;
    62         memset(b,0,sizeof(b));
    63         // for(int i=1;i<=n;i++) num[i]=a[i];
    64         int flag=0,cnt=1;
    65         for(int i=1; i<=m; i++)
    66         {
    67             for(int j=1; j<=temp[i]; j++)
    68                 b[cnt++]=flag;
    69             flag=!flag;
    70         }
    71         for(int i=1; i<=n; i++)
    72         {
    73             if(a[i]==b[i]) continue;
    74             else
    75             {
    76                 for(int j=i+1; j<=n; j++)
    77                 {
    78                     if(b[j]==!b[i])
    79                     {
    80                         swap(b[j],b[i]);
    81                         ans+=j-i;
    82                         break;
    83                     }
    84                 }
    85             }
    86         }
    87         minn=min(ans,minn);
    88     }
    89     printf("%d
    ",minn);
    90     return 0;
    91 }
  • 相关阅读:
    win10电脑只有自带浏览器能上网
    Android Studio环境安装
    小白回归
    软件工程个人总结
    学习进度第十六周
    学习进度第十五周
    第二阶段冲刺(第十天)
    《大道至简》阅读笔记03——语言只是种工具
    学习进度第十四周
    第二阶段冲刺(第九天)
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4608466.html
Copyright © 2020-2023  润新知