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;
}
uva 10716 Evil Straw Warts Live(贪心回文串)的更多相关文章
- UVA 10716 Evil Straw Warts Live(贪心)
Problem D: Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when re ...
- poj 1854 Evil Straw Warts Live 变成回文要几次
Evil Straw Warts Live Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1799 Accepted: ...
- UVa 10716 - Evil Straw Warts Live
题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数. 如果字符串中出现奇数次的字母的个数>1,则不能构成回文.然后...就没思路了...看网上说用贪心的思想先 ...
- UVA 12378 Ball Blasting Game 【Manacher回文串】
Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of differe ...
- Educational Codeforces Round 2 C. Make Palindrome —— 贪心 + 回文串
题目链接:http://codeforces.com/contest/600/problem/C C. Make Palindrome time limit per test 2 seconds me ...
- POJ 1854 - Evil Straw Warts Live
Description A palindrome is a string of symbols that is equal to itself when reversed. Given an inpu ...
- Uva 11584,划分成回文串
题目链接:https://uva.onlinejudge.org/external/115/11584.pdf 题意: 一个字符串,将它划分一下,使得每个串都是回文串,求最少的回文串个数. 分析: d ...
- UVA - 11584 划分字符串的回文串子串; 简单dp
/** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单 ...
- uva 10453 【回文串区间dp】
Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...
随机推荐
- fragment间的数据传递
今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...
- php经典bug
<?php $tem = 0=="a"?1:2; echo $tem; ?> 输出结果为:1 原因:在0=="a",这个比较中因为会将字符串&quo ...
- Java 基础入门随笔(5) JavaSE版——函数重载
1.函数 函数就是定义在类中具有特定功能的一段独立小程序,也称为方法. 定义函数的格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { ...
- 【笔记JS/HTML/CSS】web中的HTTP协议(1)
最近都在coursera刷课,加上自己课业也忙起来了,总是忘记写学习笔记ORZ 自省ing... 在写HTML的时候,form表单需要通过HTTP协议向服务器提交.查询数据(如下图) 客户端通过HTT ...
- swift protocol 与类继承结合时的bug
protocol CommonTrait: class { func commonBehavior() -> String } extension CommonTrait { func comm ...
- 判断点击第几个按钮JS代码的三种方法
方法一:使用下标实现<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- IDEA中springboot项目打包成jar
springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spri ...
- 使用SELECT语句检索数据
使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...
- Spring资源访问接口Resource
该接口拥有对不同资源类型的实现类 boolean exists() 资源是否存在 boolean isOpen() 资源是否打开 URL getURL() 如果底层资源可以表示成URL,则该方法返回对 ...
- C语言输入一行整数(OJ输入格式)
就是说输入一行用空格隔开的函数,可是它没说用回车符结束,所以一定要用EOF了 第一种方法: ; char ch; do { scanf("%ld",&a[++t]); } ...