标签:
第二题:
输入包含多组测试数据。
对于每组测试数据:
字符串s --- 代表宝石序列
n --- 代表有n条彩虹
接下来n行,每行两个数ai,bi --- 表示ai和bi由一条彩虹相连。
保证:
1<=s的长度<=10000
1<=n<=10000
且输入数据均合法。
对于每组数据,输出一个字符串
dcba 2 0 1 1 2 hellonowcoder 4 0 1 1 4 2 5 2 3
bcda ehllonowcoder
思路:
并查集 + 排序
把能互相连通的字母,进行排序
1 #include<cstdio> 2 #include<cstdlib> 3 #include<vector> 4 #include<cstring> 5 #include<algorithm> 6 7 #define N 10005 8 9 using namespace std; 10 11 int n; 12 char s[N]; 13 int f[N]; 14 char ans[N]; 15 int l; 16 17 vector<char> v[N]; 18 vector<int> pos[N]; 19 20 int find(int x){ 21 return x == f[x] ? x : f[x] = find(f[x]); 22 } 23 24 void merge(int a,int b){ 25 int fa,fb; 26 fa = find(a); 27 fb = find(b); 28 if(fa == fb) return; 29 f[fb] = fa; 30 } 31 32 void ini(){ 33 l = strlen(s); 34 scanf("%d",&n); 35 int i; 36 for(i = 0;i < l;i++){ 37 f[i] = i; 38 v[i].clear(); 39 pos[i].clear(); 40 } 41 int a,b; 42 for(i = 1;i <= n;i++){ 43 scanf("%d%d",&a,&b); 44 merge(a,b); 45 } 46 } 47 48 void solve(){ 49 int i,f; 50 for(i = 0;i < l;i++){ 51 f = find(i); 52 pos[f].push_back(i); 53 v[f].push_back(s[i]); 54 } 55 for(i = 0;i < l;i++){ 56 sort(v[i].begin(),v[i].end()); 57 } 58 for(i = 0;i < l;i++){ 59 int sz = pos[i].size(); 60 for(int j = 0;j < sz;j++){ 61 ans[ pos[i][j] ] = v[i][j]; 62 } 63 } 64 ans[l] = ‘\0‘; 65 } 66 67 int main(){ 68 while(scanf("%s",s)!=EOF){ 69 ini(); 70 solve(); 71 printf("%s\n",ans); 72 } 73 return 0; 74 }
第三题:
多组测试数据,请处理到文件结束。
对于每组测试数据:
第一行:一个整数N,代表有N种卷轴。
第二行:N种卷轴的描述。
保证:
0<=N<=50;
卷轴名称为长度1~10的字母,每种卷轴的数量为1~800之间的一个整数。
输出所有卷轴的一个排列。
3 Thunder 1 Wind 3 Soil 2
Soil Wind Thunder Wind Soil Wind
题解转自:
每种字符串的吸引值只与它第一次出现和最后一次出现的位置有关,所以我们可以先把所有字符串的首尾出现位置确定,再把其余的字符串塞到中间就行了,安排字符串位置时均按照字典序由小到大的顺序。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<vector> 5 #include<cstring> 6 #include<algorithm> 7 8 #define N 55 9 10 using namespace std; 11 12 struct PP{ 13 string s; 14 int count; 15 }A[N]; 16 17 bool cmp(PP a,PP b){ 18 return a.s < b.s; 19 } 20 21 int n; 22 string ans; 23 string l,r,mid; 24 25 void ini(){ 26 ans = l = r = mid = ""; 27 int i; 28 for(i = 0;i < n;i++){ 29 cin >> A[i].s >> A[i].count; 30 } 31 } 32 33 void solve(){ 34 sort(A , A + n,cmp); 35 int i; 36 for(i = 0;i < n;i++){ 37 if(A[i].count > 1){ 38 l += A[i].s + ‘ ‘; 39 r += A[i].s + ‘ ‘; 40 A[i].count -= 2; 41 } 42 } 43 for(i = 0;i < n;i++){ 44 while(A[i].count >= 1){ 45 mid += A[i].s + ‘ ‘; 46 A[i].count --; 47 } 48 } 49 ans = l + mid + r; 50 if(ans.size() >= 1){ 51 ans.pop_back(); 52 } 53 } 54 55 int main(){ 56 while(scanf("%d",&n)!=EOF){ 57 ini(); 58 solve(); 59 cout<<ans<<endl; 60 } 61 return 0; 62 }
标签:
原文地址:http://www.cnblogs.com/njczy2010/p/5620479.html