题意:给你无穷多个1-10的,从 1-m不停的放到天平两端,两次连续放置要在不同的天平和放不同的重量,使得每一次放置这边的天平都比对面的重量多。
解题思路:
1)暴搜,如果估算的话还是过不了的,但实际情况比估算好太多了 62ms
1 // File Name: 339c.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月03日 星期日 16时38分23秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int ans[1004]; 28 int num = 0 ; 29 int b[30]; 30 int lb = 0; 31 int m; 32 int dfs(int num ,int last ,int k) 33 { 34 if(k == m + 1) 35 return 1 ; 36 for(int i = 1;i <= lb ;i ++) 37 { 38 if(b[i] > num && b[i] != last) 39 { 40 if(dfs(b[i]-num,b[i],k+1)) 41 { 42 ans[k] = b[i]; 43 return 1; 44 } 45 } 46 } 47 return 0 ; 48 } 49 int main(){ 50 char str[14]; 51 scanf("%s",str); 52 scanf("%d",&m); 53 int len = strlen(str); 54 for(int i = 0;i < len; i ++) 55 { 56 if(str[i] == '1') 57 { 58 lb ++ ; 59 b[lb] = i+1 ; 60 } 61 } 62 if(dfs(0,0,1)) 63 { 64 printf("YES ") ; 65 for(int i =1 ;i <= m;i ++) 66 printf("%d ",ans[i]); 67 }else{ 68 printf("NO "); 69 } 70 return 0; 71 }
2)DP
dp[i][j][k],基本上和暴搜类似,i,表示层数,j表示状态,k表示上次选的是哪个数,但是去除了重复的情况,代码吃完饭回来再写QAQ 然后发现跑的时间还是 62ms 。。
应该是10^8 比 1)的 10^1000期望好太多了,可能答案有限吧。
1 // File Name: 339.1.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月03日 星期日 17时13分53秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int dp[1004][14][14]; 28 int lb = 0 ;; 29 int b[100]; 30 int m ; 31 void dfs(int i, int j ,int k ) 32 { 33 if(i == 0 ) 34 return; 35 dfs(i-1,k-j,dp[i][j][k]); 36 printf("%d ",k); 37 } 38 int main(){ 39 char str[14]; 40 scanf("%s",str); 41 scanf("%d",&m); 42 int len = strlen(str); 43 for(int i = 0 ;i < len;i++) 44 { 45 if(str[i] == '1') 46 { 47 lb ++ ; 48 b[lb] = i + 1; 49 } 50 } 51 memset(dp,-1,sizeof(dp)); 52 dp[0][0][0] = 0; 53 for(int i =1;i<= m;i ++) 54 { 55 for(int j = 0;j <= 10;j ++) 56 for(int k = 0 ;k <= 10 ;k ++) 57 { 58 if(dp[i-1][j][k] != -1 ) 59 { 60 //printf("%d %d %d ",i,j,k); 61 for(int s = 1;s <= lb ;s ++ ) 62 { 63 if(b[s] > j && b[s] != k) 64 { 65 dp[i][b[s]-j][b[s]] = k ; 66 //printf("***%d %d %d ",i,b[s]-j,b[s]); 67 } 68 } 69 } 70 } 71 } 72 for(int i = 1 ;i <= 10;i ++) 73 { 74 for(int j = 1;j <= 10;j ++) 75 { 76 if(dp[m][i][j] != -1 ) 77 { 78 printf("YES "); 79 dfs(m,i,j); 80 return 0; 81 } 82 } 83 } 84 printf("NO ") ; 85 return 0; 86 }