UVA 10716 - Evil Straw Warts Live
2013-06-15 13:36
381 查看
思路还是不成熟,这个题WA了好多次‘,判断能否变成回文对了,但是交换时只是从左起第i位(i=0,1,2,……),找到与之相同的,移到与第i位对称的位置,同时记录步数,但是这并不是最小的交换次数,看到/article/1632490.html,应该是使每次交换所需的移动步数最小。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> using namespace std; int main() { //freopen("in.txt","r",stdin); int cas,num[30],step,vis[110]; char str[110]; scanf("%d",&cas); getchar(); while(cas--) { gets(str); memset(num,0,sizeof(num)); for(int i=0; str[i]!='\0'; i++) num[str[i]-'a']++; int flag=0; for(int i=0; i<26; i++) if(num[i]%2) flag++; if(flag>1||(flag&&strlen(str)%2==0)) { cout<<"Impossible\n"; continue; } step=0; int right=strlen(str)-1,left=0; while(left<right) { memset(vis,0,sizeof(vis)); int lleft=left,rright=right,max=100000; for(int i=left; i<right; i++) { if(vis[i]) continue; vis[i]=1; int last=i; for(int j=i+1; j<=right; j++) { if(str[j]==str[i]) { flag=1; last=j;vis[j]=1; } } if(right-last+i-left<max) { max=right-last+i-left; lleft=i; rright=last; } } for(int i=lleft; i>left; i--) { char temp; temp=str[i]; str[i]=str[i-1]; str[i-1]=temp; step++; } for(int i=rright; i<right; i++) { char temp; temp=str[i]; str[i]=str[i+1]; str[i+1]=temp; step++; } left++; right--; } cout<<step<<endl; } return 0; }
相关文章推荐
- UVA 10716 Evil Straw Warts Live
- UVa 10716 - Evil Straw Warts Live
- UVa 10716 - Evil Straw Warts Live
- uva 10716 - Evil Straw Warts Live
- uva10716 - - Evil Straw Warts Live
- UVA 10716 Evil Straw Warts Live(贪心)
- UVA 10716 Evil Straw Warts Live
- uva 10716 - Evil Straw Warts Live
- uva 10716 Evil Straw Warts Live
- UVA-10716 Evil Straw Warts Live(贪心+模拟)
- uva 10716 Evil Straw Warts Live (贪心)
- uva - 10716 - Evil Straw Warts Live(贪心、模拟)
- uva 10716 Evil Straw Warts Live(贪心回文串)
- UVa:10716 Evil Straw Warts Live
- uva 10716 - Evil Straw Warts Live
- UVA10716 - Evil Straw Warts Live
- uva 10716 Evil Straw Warts Live
- uva 10716 Evil Straw Warts Live(贪心)
- UVa 10716 - Evil Straw Warts Live
- uva 10716 Evil Straw Warts Live(贪心回文串)