Bit String Reordering

题目来源: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;
}

时间: 2024-10-12 16:49:03

Bit String Reordering的相关文章

贪心 UVALive 6832 Bit String Reordering

题目传送门 1 /* 2 贪心:按照0或1开头,若不符合,选择后面最近的进行交换.然后选取最少的交换次数 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <string> 8 #include <cmath> 9 #include <vector> 10 #include <map> 11 #include &l

coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 Bit String Reordering(未完)

Portal: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1345  http://codeforces.com/gym/100803/attachments  A题 好题! 坑不多,切入比较难 一开始的想法是暴力,由于求得是最小解且此图太大无边界,所以不能DFS,首先想到BFS 解法1 BFS+STL queue 1 #include<iostream> 2 #include<algorithm> 3 #in

csu - 1536: Bit String Reordering (模拟)

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 不知道为何怎么写都写不对. 这题可以模拟. 虽然题目保证一定可以从原串变成目标串,但是不一定可以变成两种目标串. 所以需要判断下.统计原串中0和1的个数,然后计算目标串中0可能的个数,1可能的个数. 计算交换次数就是从后面找一个跟当前不一样的数字交换到前面来即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cs

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

"The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException" "构造函数ClassPathXmlApplicationContext(字符串)是指缺失类型BeansException" 出现错误的原因:jar没有正确引入,即使表面上你能import包. import org.junit.Test; import org.spring

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

JAVA: String详解

String 类用来存储字符串 ,是不可变的. 1. 基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2. 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.用 str.equals(str2) 方法来比较字符串的值是否相等. 3. len