题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=170
解题报告:输入两个由'+'和'-'组成的字符串,让你判断第二个串能不能由第一个串中的字符交换位置得到,不能的话输出-1,能的话输出最少的需要交换的次数。
一开始以为是DP,后来仔细一看发现,+号之间相对的位置是固定的,就是说如果可以,+号在调换位置的过程中是不会跟+号调换的,只跟-号调换,只有这样才能保证交换的次数是最少的。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 5000+5; 7 char s[maxn],t[maxn]; 8 int tt1[maxn],tt2[maxn]; 9 int main() 10 { 11 while(scanf("%s%s",s,t)!=EOF) 12 { 13 int len1 = strlen(s); 14 int len2 = strlen(t); 15 if(len1 != len2) //两个串长度不同,肯定不行 16 { 17 printf("-1 "); 18 continue; 19 } 20 int f1 = 0,f2 = 0; 21 for(int i = 0;i < len1;++i) 22 if(s[i] == '+') 23 tt1[f1++] = i; 24 for(int i = 0;i < len2;++i) 25 if(t[i] == '+') 26 tt2[f2++] = i; 27 if(f1 != f2) //'+'这个数目不相同,肯定不行 28 { 29 printf("-1 "); 30 continue; 31 } 32 int ans = 0; 33 for(int i = 0;i < f1;++i) 34 ans += abs(tt1[i] - tt2[i]); 35 printf("%d ",ans); 36 } 37 return 0; 38 } 39