UVa 140 (枚举排列) Bandwidth

题意较复杂,请参见原题=_=||

没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列。

STL里的next_permutation函数真是好用。

比较蛋疼的就是题目的输入了。。

 #include <bits/stdc++.h>
using namespace std; const int maxn = ; int id[], letter[maxn];
char in[]; int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%s", in) == && in[] != '#')
{
int n = ;
for(char ch = 'A'; ch <= 'Z'; ++ch)
if(strchr(in, ch) != NULL)
{
id[ch] = n;
letter[n++] = ch;
} int l = strlen(in), p = , q = ;
vector<int> u, v;
for(;;)
{
while(p < l && in[p] != ':') p++;
if(p == l) break;
while(q < l && in[q] != ';') q++;
for(int i = p+; i < q; ++i)
{
u.push_back(id[in[p-]]);
v.push_back(id[in[i]]);
}
p++; q++;
} int P[maxn], bestP[maxn], pos[maxn], ans = n;
for(int i = ; i < n; ++i) P[i] = i;
do
{
for(int i = ; i < n; ++i) pos[P[i]] = i;
int bandwidth = ;
for(int i = ; i < u.size(); ++i) bandwidth = max(bandwidth, abs(pos[u[i]] - pos[v[i]]));
if(bandwidth < ans)
{
ans = bandwidth;
memcpy(bestP, P, sizeof(P));
}
}while(next_permutation(P, P+n)); for(int i = ; i < n; ++i) printf("%c ", letter[bestP[i]]);
printf("-> %d\n", ans);
} return ;
} 代码君

代码君

上一篇:Network | TCP congestion control


下一篇:anaconda 安装opencv win10