• uva 10716 Evil Straw Warts Live(贪心回文串)


    这道题目我用了一上午才做出来,还是看的别人的思路,尽管没有看代码做的有点慢。代码能力还是得加强啊。思维

    得缜密。不能想当然,要有根据,写上的代码要有精确度。省的以后还得慢慢调试

    思路:贪心。每次都查看两端位置上的字母是否相等。若不相等就在里面查找能使他们相等且所需移动位置最少的那

    个。然后交换。记录交换的距离,贪心的离最后一个由近及远找与第一个位置相等的。同理贪心从第一个位置找和最

    后一个位置相等且离第一个位置近期的。

    。感觉这样的方法确实能够,可是并不会证明这样的策略的正确性。。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<set>
    #include<string>
    #include<algorithm>
    
    using namespace std;
    int a[30];
    string s;
    void swap1(int x,int y)
    {
    	char ch = s[x];
    	for(int i=x; i<y; i++)
    	{
    		s[i] = s[i+1];
    	}
    	s[y] = ch;
    	return ;
    }
    void swap2(int x,int y)
    {
    	char ch = s[y];
    	for(int i=y; i>x; i--)
    	{
    		s[i] = s[i-1];
    	}
    	s[x] = ch;
    	return ;
    }
    int cost;
    void solve()
    {
    	int i,j;
    	for(i=0; i<(s.size()/2); i++)
    	{
    		//cout << "i = "<<i << endl;
    		if(s[i]!=s[s.size()-1-i])
    		{
    			for(j=1; j<=s.size()-1-1-i-i; j++)
    			{
    				if(s[j+i]== s[s.size()-1-i])//推断是否和最后一个相等。若相等就放到对称位置 
    				{
    					swap2(i,i+j);//准确写出移动函数 
    					//cout << s << endl;
    					cost += j;//移动距离 
    					break;
    				}
    				else if(s[s.size()-1-i-j] == s[i])//推断是否和第一个相等。若相等就和最后一个互换。即它的最后一个位置(这里所说第一个位置是当前推断的位置不是所有序列的第一个) 
    				{ 
    					swap1(s.size()-1-i-j,s.size()-1-i);//注意调用的移动函数是否可行 
    					//cout << s << endl;
    					cost+= j;
    					break;
    				}
    			}
    		}
    	}
    	return ;
    }
    int main()
    {
    	int T,i;
    	int ans;
    	cin >> T;
    	getchar();
    	while(T--)
    	{
    		ans = 0;
    		memset(a,0,sizeof(a));
    		s.clear();
    		cin >> s;
    		getchar();
    		for(i=0; i<s.size(); i++)
    		{
    			a[s[i]-'a']++;
    		}
    		int flag = 0;
    		for(i=0; i<26; i++)//预处理能否够构成回文数 
    		{
    			if(a[i]%2!=0)
    			{
    				ans++;
    			}
    		}
    		cost = 0;
    		if(ans > 1)
    			cout << "Impossible" << endl;
    		else
    		{
    			solve();
    			cout << cost << endl;
    		}
    	} 
    	return 0;
    }
    


  • 相关阅读:
    [转]Invalid postback or callback argument
    DOS之用变量存储输出
    [转]Invalid character in a Base64 string
    [转]100 个强大的 CSS 制作菜单的教程
    [转]delphi的TList,TStringList,TObjectList
    面试感悟一名3年工作经验的程序员应该具备的技能
    Java编程思想重点笔记(Java开发必看)
    第一大章物理层思维导图
    第一大章1.1概论
    jmeter 正则表达式学习(二)使用实例 非墨
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7113065.html
Copyright © 2020-2023  润新知