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\n",b[i]+1,a[i]+1); 54 } 55 return 0; 56 }