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 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<queue>
 8 using namespace std;
 9 #define FOR(i,j,k) for(int i=j;i<=k;i++)
10 #define FORD(i,j,k) for(int i=j;i>=k;i--)
11 #define LL long long
12 #define SZ(x) x.size()
13 int vis[40000];
14 int x,k,n,m,s,ans,start,end1,end2,dight;
15 int bfs()
16 {
17     queue<int> q1,q2;
18     q1.push(start);
19     q2.push(1);
20     vis[start]=1;
21     while(q1.front()!=end1&&q1.front()!=end2)
22     {
23         int fr=q1.front();
24         int fv=q2.front();
25         FOR(i,0,n-2)
26         {
27             if((fr&(1<<i))&&!(fr&(1<<(i+1))))
28             {
29                 ans=fr+(1<<i);
30                 if(!vis[ans]) {vis[ans]=1;q1.push(ans);q2.push(fv+1);}
31             }
32             else if(!(fr&(1<<i))&&(fr&(1<<(i+1))))
33             {
34                 ans=fr-(1<<i);
35                 if(!vis[ans]) {vis[ans]=1;q1.push(ans);q2.push(fv+1);}
36             }
37         }
38         q1.pop();
39         q2.pop();
40     }
41     return q2.front()-1;
42 }
43 int main()
44 {
45 cin>>n>>m;
46 dight=1;
47 FORD(i,n-1,0)
48 {
49     cin>>x;
50     start+=x<<i;
51 }
52 int c=n;
53 FOR(i,1,m)
54 {
55     cin>>x;
56     FOR(j,1,x)
57     {
58         c--;
59         end1+=dight<<c;
60         end2+=(1-dight)<<c;
61     }
62     dight^=1;
63 }
64 cout<<bfs()<<endl;
65 return 0;
66 }

蛋疼的代码

解法2 BFS+手写queue

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 //#include<queue>
 8 using namespace std;
 9 #define FOR(i,j,k) for(int i=j;i<=k;i++)
10 #define FORD(i,j,k) for(int i=j;i>=k;i--)
11 #define LL long long
12 #define SZ(x) x.size()
13 int vis[40000];
14 int x,k,n,m,s,ans,start,end1,end2,dight;
15
16 int bfs()
17 {
18     int q1[40000];int L1=1;int R1=0;
19     int q2[40000];int L2=1;int R2=0;
20     q1[++R1]=start;
21     q2[++R2]=1;
22     vis[start]=1;
23     while(q1[L1]!=end1&&q1[L1]!=end2)
24     {
25         int fr=q1[L1];
26         int fv=q2[L2];
27         FOR(i,0,n-2)
28         {
29             if((fr&(1<<i))&&!(fr&(1<<(i+1))))
30             {
31                 ans=fr+(1<<i);
32                 if(!vis[ans]) {vis[ans]=1;q1[++R1]=ans;q2[++R2]=fv+1;}
33             }
34             else if(!(fr&(1<<i))&&(fr&(1<<(i+1))))
35             {
36                 ans=fr-(1<<i);
37                 if(!vis[ans]) {vis[ans]=1;q1[++R1]=ans;q2[++R2]=fv+1;}
38             }
39         }
40         L1++;
41         L2++;
42     }
43     return q2[L2]-1;
44 }
45 int main()
46 {
47 cin>>n>>m;
48 dight=1;
49 FORD(i,n-1,0)
50 {
51     cin>>x;
52     start+=x<<i;
53 }
54 int c=n;
55 FOR(i,1,m)
56 {
57     cin>>x;
58     FOR(j,1,x)
59     {
60         c--;
61         end1+=dight<<c;
62         end2+=(1-dight)<<c;
63     }
64     dight^=1;
65 }
66 cout<<bfs()<<endl;
67 return 0;
68 }

同样的代码

比较同样情况下STL的queue和手写的queue,我发现STL的queue内存比手写的多了4KB

这是个严重的问题,因为STL经常pop元素,是动态的,它的内存一定较小,但即便在手写的queue固定大小为8e5个int的情况下,仍然多4KB,即1e3个int

STL的queue在此题理论上能够最多有16384个元素,所以事实上同等长度的queue所用内存相当于3到4倍同等int

所以,我们应该谨慎使用STL,为保险起见,用queue时数据输入的极限容量不得多于1e7,即1/10int在32768KB下容量左右

在解法1/2的代码中使用了位运算的黑科技

FORD(i,n-1,0)
{
    cin>>x;
    start+=x<<i;
}
int c=n;
FOR(i,1,m)
{
    cin>>x;
    FOR(j,1,x)
    {
        c--;
        end1+=dight<<c;
        end2+=(1-dight)<<c;
    }
    dight^=1;
}

///

    if((fr&(1<<i))&&!(fr&(1<<(i+1))))
            {
                ans=fr+(1<<i);
                if(!vis[ans]) {vis[ans]=1;q1[++R1]=ans;q2[++R2]=fv+1;}
            }
            else if(!(fr&(1<<i))&&(fr&(1<<(i+1))))
            {
                ans=fr-(1<<i);
                if(!vis[ans]) {vis[ans]=1;q1[++R1]=ans;q2[++R2]=fv+1;}
            }

神奇的做法

其中(fr&(1<<i))&&!(fr&(1<<(i+1)))最妙

fr&(1<<i)表示判断fr的二进制表示中第i位是否为1(利用了c++非0为真的机制)

这样使用黑科技的原因是这题中交换相同的二进制位是没有意义

所以仅仅交换01和10来产生当前数字的邻居

解法3(2) 贪心

时间: 2024-08-02 15:11:17

coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 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

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

UVaLive 7637 Balanced String (构造)

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

CSU 1552 Friends(二分图 + 米勒测试)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1552 Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterrestrials can be friends. But every extraterrestr

Gym - 100971J

题目:http://codeforces.com/gym/100971/problem/J #include<vector> #include<iostream> #include<string> using namespace std; int main() { int n, m; cin >> n >> m; int cnt = 0; bool flag = true; vector<string> a(n);//定义存储n个st

Fear Factoring Gym - 101615C(除法分块)

http://codeforces.com/gym/101615/attachments 1 #include <stdio.h> 2 #include <string.h> 3 4 unsigned long long solve(unsigned long long n) 5 { 6 unsigned long long l, r, re; 7 re = 0; 8 for(l=1;l<=n;l=r+1) 9 { 10 r = n/(n/l); 11 re = re + (

Gym 102392D

题目链接:https://vjudge.net/problem/2882397/origin [问题描述] 伟大的巫师给Alice和Bob周期长度的字符串2⋅n,没有重复的子字符串的长度n.循环字符串,字符si+1在si之后.同样,s1在s2n之后. 不幸的是,邪恶的琴子打乱了字符串的所有符号.帮助Alice和Bob恢复原始字符串,从而满足上述条件. 输入 第一行包含一个字符串的长度2⋅n (2≤2⋅n≤1000000)只由拉丁字母的小写组成. 输出 如果无法恢复字符串以满足条件,则在第一行打印

数据解析1:XML解析(2)

上一篇着重记录了XML解析中的SAX解析,该篇继续上篇(数据解析1:XML解析(2))未讲完的内容. XML补充: 1. 2. . 3. 示例:使用SAX解析一个比较复杂的XML文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- START_DOCUMET:第一个节点 3 END_DOCUMET:尾节点 4 START_TAG:其他的首部的节点 p pn c cn... 5 END_TAG:其他的尾

Openfire Strophe开发中文乱码问题

网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题  一直没调试成功  估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很久没维护  CSDN上下来个版本但jar包路径不对  花了不少时间总算能跑起来,不过版本是flex3版本,太老了   自己花精力升级有点费时间呀 最后采用存脚本开发Strophejs,下面网站写的很详细 学习的网站:http://www.dotblogs.com.tw/sungnoone/archi