贪心 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 <queue>
12 using namespace std;
13
14 const int MAXN = 22 + 10;
15 const int INF = 0x3f3f3f3f;
16 int a[MAXN], b[MAXN], c[MAXN];
17
18 int main(void)        //UVALive 6832 Bit String Reordering
19 {
20 //    freopen ("A.in", "r", stdin);
21
22     int n, m;
23     while (scanf ("%d%d", &n, &m) == 2)
24     {
25         for (int i=1; i<=n; ++i)    {scanf ("%d", &a[i]);    c[i] = a[i];}
26         for (int i=1; i<=m; ++i)    scanf ("%d", &b[i]);
27
28         int cnt1 = 0, cnt2 = 0;    int now = 0;    int p = 0;
29         bool ok1 = true, ok2 = true;
30         for (int i=1; i<=m && ok1; ++i)
31         {
32             for (int j=1; j<=b[i]; ++j)
33             {
34                 if (a[p+j] != now)
35                 {
36                     int k = p + j;
37                     while (k <= n && a[k] != now)    k++;
38                     if (k == n+1 || a[k] != now)    {ok1 = false;    break;}
39                     cnt1 += k - (p + j);
40                     swap (a[k], a[p+j]);
41                 }
42             }
43             p += b[i];    now = 1 - now;
44         }
45
46         now = 1;    p = 0;
47         for (int i=1; i<=m && ok2; ++i)
48         {
49             for (int j=1; j<=b[i]; ++j)
50             {
51                 if (c[p+j] != now)
52                 {
53                     int k = p + j;
54                     while (k <= n && c[k] != now)    k++;
55                     if (k == n+1 || c[k] != now)    {ok2 = false;    break;}
56                     cnt2 += k - (p + j);
57                     swap (c[p+j], c[k]);
58                 }
59             }
60             p += b[i];    now = 1 - now;
61         }
62
63 //        printf ("%d %d\n", cnt1, cnt2);
64         if (!ok1)    printf ("%d\n", cnt2);
65         else if (!ok2)    printf ("%d\n", cnt1);
66         else    printf ("%d\n", min (cnt1, cnt2));
67     }
68
69     return 0;
70 }
时间: 2024-10-10 21:10:05

贪心 UVALive 6832 Bit String Reordering的相关文章

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

贪心 UVALive 6834 Shopping

题目传送门 1 /* 2 题意:有n个商店排成一条直线,有一些商店有先后顺序,问从0出发走到n+1最少的步数 3 贪心:对于区间被覆盖的点只进行一次计算,还有那些要往回走的区间步数*2,再加上原来最少要走n+1步就是答案了 4 详细解释:http://blog.csdn.net/u013625492/article/details/45640735 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstr

UVaLive 7637 Balanced String (构造)

题意:给定一个括号的序列,原先的序列是碰到左括号加1,碰到右括号减1,然后把序列打乱,让你找出字典序最小的一个答案. 析:直接从第一个括号判断就好了,优先判断左括号,如果不行就加右括号. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cma

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

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

最小生成树之Prim算法 C++实现

Prim算法大致介绍(个人理解) 1:图中所有的点组成了一个集合set,从集合set中随意选取一个点s,开始进行该算法, 2:从set中将该点s删除,并将该点s加入到另外一个集合now中,now初始为空 3:对now中的所有节点进行遍历,找到距离now的最近的那个非集合now的节点,并将该节点从set中删除,加入now中, 4:重复步骤3,直到set集合为空 无向图: #include<map> #include<vector> #include<string> #in

Codeforces Round #604 (Div. 2) D、E、F题解

Beautiful Sequence \[ Time Limit: 1000 ms\quad Memory Limit: 256 MB \] 首先我们可以考虑到 \(0\) 只能 和 \(1\) 放在一起.\(3\) 只能和 \(2\) 放在一起,那么我们想办法先把 \(0\) 和 \(3\) 凑出来,最后就剩下 \(1\) 和 \(2\) 了,我们只要把他们放在一起就可以了. 所以我们可以贪心考虑三个 \(string\),分别长成 \(0101...0101\).\(2323...2323\

【贪心】UVALive 6530——Football

Your favorite football team is playing a charity tournament, which is part of a worldwide fundraising e ort to help children with disabilities. As in a normal tournament, three points are awarded to the team winning a match, with no points to the los

UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)

先从中找出性能最好的那个数, 在用钱比较少的去组合,能组出来就表明答案在mid的右边,反之在左边, #include<string.h> #include<map> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; map<string,int> vic;//以字符映射数字 int end,start; int num; int