码迷,mamicode.com
首页 > 其他好文 > 详细

Bit String Reordering

时间:2015-05-22 09:43:17      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:数字处理   贪心   

题目来源:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=139521

输入:

6 3
1 0 0 1 0 1
1 3 2
输出:

1


题意:

输入:n m (1<n<15,1<m<n)

第二行:n个数(只含1和0)

第三行:m个数

问用n个数1与0要移动多少次(相邻才能移动),利用1与0间隔个数才能表示出m个数

输入移动次数;

例:

     1 2  3  4  5  6
    1  0   0   1    0   1
把下标为4的数与下标为5的数移动一次,变成:
     1 2  3  4  5  6
    1  0   0   0    1   1
与 : 1       3           2 刚刚好
输出:1

思路:贪心
   从左往右依次扫,开始只有两种情况,要么是以0开始,要么就是为1开始。
   首先就把以1或0开始定下来。
   然后,根据输入的m个数,来把n中每一段取出来,经行处理,如果发现这一段中有不符合的,就在往后最近的位置找一个符合的,下标相减,就是移动的次数。为了方便,最好在存N个数的时候下标从1开始。
  如果既可以从1开始,又可以从0开始,就两种都算一次,取小的那一个。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int s1[20],s2[20],n;
int MAX=1000000000;
int fun1(int j,int v)
{
   int k,t,ans=0;
     v^=1;
    for(k=j+1;k<=n;k++)
     {
        if(s1[k]==v)
             {
                ans=k-j;
                t=s1[k];s1[k]=s1[j];s1[j]=t;
                break;
             }
     }
      return ans;
}
int fun2(int j,int v)
{
   int k,t,ans=0;
     if(v) v=0;
      else v=1;
    for(k=j+1;k<=n;k++)
     {
        if(s2[k]==v)
             {
                ans=k-j;
                t=s2[k];s2[k]=s2[j];s2[j]=t;
                break;
             }
     }
      return ans;
}
int main()
{
    int i,j,m,x,f,ans1,ans2,a[20],x1,x0,y,z;

    while(scanf("%d%d\n",&n,&m)==2)
    {
         ans1=ans2=0;
         x1=x0=y=0;
     for(i=1;i<=n;i++)
       {
           scanf("%d",&s1[i]);
             s2[i]=s1[i];
            if(s1[i]==0) x0++;//统计0的个数 
             else x1++;//统计1的个数 
       }
       for(i=1;i<=m;i++)
       {
           scanf("%d",&a[i]);
           if(i%2!=0) y+=a[i];//统计下标为奇数位数的和 
       }
       if(y==x1)//从1开始 
       {
         f=0;z=0;
       for(i=1,j=1;i<=m;i++)
       {
         for(j=z+1;j<=z+a[i];j++)//取出每一段 
           if(s1[j]==f) ans1+=fun1(j,s1[j]);
          f^=1;
         z+=a[i];
       }
       MAX=ans1<MAX?ans1:MAX;
       }
       if(y==x0)//从0开始 
       {
        f=1;
        z=0;
       for(i=1,j=1;i<=m;i++)
       {
         for(j=z+1;j<=z+a[i];j++)
           if(s2[j]==f) ans2+=fun2(j,s2[j]);
          f^=1;
         z+=a[i];
       }
        MAX=ans2<MAX?ans2:MAX;
      }
      printf("%d\n",MAX);
    }
    return 0;
}


 

Bit String Reordering

标签:数字处理   贪心   

原文地址:http://blog.csdn.net/u012346225/article/details/45912659

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!