题意较复杂,请参见原题=_=||
没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列。
STL里的next_permutation函数真是好用。
比较蛋疼的就是题目的输入了。。
还有就是不明白,为什么19、20行注释哪错了??
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 10; 5 6 int id[256], letter[maxn]; 7 char in[1000]; 8 9 int main() 10 { 11 freopen("in.txt", "r", stdin); 12 13 while(scanf("%s", in) == 1 && in[0] != ‘#‘) 14 { 15 int n = 0; 16 for(char ch = ‘A‘; ch <= ‘Z‘; ++ch) 17 if(strchr(in, ch) != NULL) 18 { 19 //id[ch] = n; 20 //letter[n++] = ch; 21 id[ch] = n++; 22 letter[id[ch]] = ch; 23 } 24 25 int l = strlen(in), p = 0, q = 0; 26 vector<int> u, v; 27 for(;;) 28 { 29 while(p < l && in[p] != ‘:‘) p++; 30 if(p == l) break; 31 while(q < l && in[q] != ‘;‘) q++; 32 for(int i = p+1; i < q; ++i) 33 { 34 u.push_back(id[in[p-1]]); 35 v.push_back(id[in[i]]); 36 } 37 p++; q++; 38 } 39 40 int P[maxn], bestP[maxn], pos[maxn], ans = n; 41 for(int i = 0; i < n; ++i) P[i] = i; 42 do 43 { 44 for(int i = 0; i < n; ++i) pos[P[i]] = i; 45 int bandwidth = 0; 46 for(int i = 0; i < u.size(); ++i) bandwidth = max(bandwidth, abs(pos[u[i]] - pos[v[i]])); 47 if(bandwidth < ans) 48 { 49 ans = bandwidth; 50 memcpy(bestP, P, sizeof(P)); 51 } 52 }while(next_permutation(P, P+n)); 53 54 for(int i = 0; i < n; ++i) printf("%c ", letter[bestP[i]]); 55 printf("-> %d\n", ans); 56 } 57 58 return 0; 59 }
代码君
时间: 2024-10-21 14:10:00