日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

發布時間:2024/1/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 csu 1536 Bit String Reordering(模拟 bfs+状态压缩) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

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

題意: 輸入n個只為 0或1 的數 形成一個排列

? ? ? ? ?再輸入m個數 每個數代表 目標排列

? ? ? ?(樣例

1 0 0 1 0 1
1 3 2

目標排列有可能為
1 0 0 0 1 1 或 0 1 1 1 0 0
? ?)
每次只能移動相鄰的數

? ? ? ? ?問最少幾步達到

?

思路:1 純模擬?

? ? ? ? ? ?對目標串分類討論

? ? ? ? ? 如果起始串和目標串上對應位置數字不一樣

? ? ? ? ??swap(b[j],b[i]);

? ? ? ? ? ans+=j-i;

? ? ? ?

? ? ? ?2 bfs+狀態壓縮

? ? ? ? ?將起始串和兩種可能的目標串狀壓?

? ? ? ? ?并bfs相鄰狀態 記錄步數

? ? ? ? ?達到目標串狀態時 輸出結果? ? ??

?

模擬:

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<stdlib.h> #include<algorithm> using namespace std; const int MAXN=20; int a[MAXN],b[MAXN],num[MAXN],temp[MAXN],ans; void swap(int &a,int &b) {int temp;temp=a;a=b;b=temp; } int min(int a,int b) {if(a>b) return b;else return a; } int main() {int n,m,num0=0,num1=0,res1=0,res2=0;int minn=0x3f3f3f3f;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==1) num1++;if(a[i]==0) num0++;}for(int i=1;i<=m;i++){scanf("%d",&temp[i]);if(i%2==1) res1+=temp[i];if(i%2==0) res2+=temp[i];}if(res1==num1){ans=0;memset(b,0,sizeof(b));for(int i=1;i<=n;i++) num[i]=a[i];int flag=1,cnt=1;for(int i=1;i<=m;i++){for(int j=1;j<=temp[i];j++)b[cnt++]=flag;flag=!flag;}for(int i=1;i<=n;i++){if(num[i]==b[i]) continue;else{for(int j=i+1;j<=n;j++){if(b[j]==!b[i]){swap(b[j],b[i]);ans+=j-i;break;}}}}minn=min(ans,minn);}if(res1==num0){ans=0;memset(b,0,sizeof(b));for(int i=1;i<=n;i++) num[i]=a[i];int flag=0,cnt=1;for(int i=1;i<=m;i++){for(int j=1;j<=temp[i];j++)b[cnt++]=flag;flag=!flag;}for(int i=1;i<=n;i++){if(num[i]==b[i]) continue;else{for(int j=i+1;j<=n;j++){if(b[j]==!b[i]){swap(b[j],b[i]);ans+=j-i;break;}}}}minn=min(ans,minn);}printf("%d\n",minn);return 0; }

?

bfs+狀態壓縮

#include <algorithm> #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <map> #define N 1000005 #define lson o<<1, l, m #define rson o<<1|1, m + 1, r #define mod 1000000007 using namespace std; typedef long long LL;int n,m; int vis[100050]; int a[20],b[20],c[20]; int ans[2]; int st;int bfs() {int pre[100005];int begin = 0,end = 1;pre[0] = st;int t[100006];t[0] = 0;while(begin < end){int w = pre[begin];if(w == ans[0] || w == ans[1]){return t[begin];}int i;int g = 1;int now;for(i = 0; i < n - 1; i++){if(((w >> i) & 1) != ((w >>(i + 1)) & 1)){if(((w >> i) & 1) == 1){now = w + g;}else{now = w - g;}if(vis[now] == 0){vis[now] = 1;pre[end] = now;t[end++] = t[begin] + 1;}}g *= 2;}begin++;} } int main() {while(scanf("%d %d",&n,&m)!=EOF){int i,j;st = 0;for(i = 0; i < n; i++){scanf("%d",&a[i]);}int g = 1;for(i = n - 1; i >= 0; i--){st += a[i] * g;g *= 2;}for(i = 0; i < m; i++){scanf("%d",&b[i]);}g = 0;j = 0;for(i = 0; i < m; i++){for(int k = 0; k < b[i]; k++){c[j++] = g;}g ^= 1;}ans[0] = ans[1] = 0;g = 1;for(i = n - 1; i >= 0; i--){ans[0] += c[i] * g;g *= 2;}g = 1;j = 0;for(i = 0; i < m; i++){for(int k = 0; k < b[i]; k++){c[j++] = g;}g ^= 1;}g = 1;for(i = n - 1; i >= 0; i--){ans[1] += c[i] * g;g *= 2;} memset(vis,0,sizeof(vis));printf("%d\n",bfs());}return 0; }

  

轉載于:https://www.cnblogs.com/sola1994/p/4369259.html

總結

以上是生活随笔為你收集整理的csu 1536 Bit String Reordering(模拟 bfs+状态压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。