Codeforces Gym101606 D.Deranging Hat (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

D Deranging Hat

这个题简直了,本来想的是冒泡排序然后逆着输出来的,后来发现不对,因为题目上求的是最优解,而且冒泡的话,输出结果有的超出10000行了,所以就是把一开始的,排好序的字母标记一下位置,然后再把要求的串的位置记录一下,从大到小输出来,鬼知道这道题到底要干嘛,反正有人写出来了而且他自己都解释不清楚他为什么这么写。。。

代码:(不是我的)

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<math.h>
 6 #include<cstdlib>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<queue>
11 #include<vector>
12 #include<set>
13 #define ll long long int
14 #define INF 0x3f3f3f3f
15 #define mod 1000000007
16 #define me(a,b) memset(a,b,sizeof(a))
17 using namespace std;
18 struct node{
19     char str;
20     int pi;
21 }s[1005];
22 char str[1005];
23 int a[10005],b[10005],c;
24 bool cmp(node a,node b){
25     if(a.str!=b.str) return a.str<b.str;
26     return a.pi<b.pi;
27 }
28 int main(){
29     scanf("%s",&str);
30     int l=strlen(str);
31     for(int i=0;i<l;i++){
32         s[i].str=str[i];
33         s[i].pi=i;
34     }
35     sort(s,s+l,cmp);
36     c=0;
37     int n[1005];
38     for(int i=0;i<l;i++){
39         n[s[i].pi]=i;
40     }
41     for(int i=0;i<l;i++){
42         if(s[i].pi!=i){
43             a[c]=i;
44             b[c]=s[i].pi;
45             c++;
46             int pre=s[i].pi;
47             int now=n[i];
48             swap(s[now],s[i]);
49             n[pre]=now;
50         }
51     }
52     for(int i=c-1;i>=0;i--){
53         printf("%d %d
",b[i]+1,a[i]+1);
54     }
55     return 0;
56 }
原文地址:https://www.cnblogs.com/ZERO-/p/9703438.html