POJ 1854 贪心

链接:

http://poj.org/problem?id=1854

题意:

给你一个字符串,每次你能交换两个相邻的字符,问你最少交换多少次,使它变成回文串

题解:

从两边向中间进行贪心选择,要么更改左边使和右边相等,要么更改右边使和左边相等,取最小的那个就行了

代码:

31 int main() {
32     int T;
33     cin >> T;
34     while (T--) {
35         string s;
36         cin >> s;
37         int n = s.length();
38         map<char, int> mmp;
39         rep(i, 0, n) mmp[s[i]]++;
40         int sum = 0;
41         rep(i, ‘a‘, ‘z‘ + 1) if (mmp[i] & 1) sum++;
42         if (sum > 1) {
43             cout << "Impossible" << endl;
44             continue;
45         }
46         int ans = 0;
47         for (int i = 0, j = n - 1; i < j; i++, j--) {
48             int l, r;
49             for (r = j; r > i; r--) if (s[i] == s[r]) break;
50             for (l = i; l < j; l++) if (s[j] == s[l]) break;
51             if (j - r > l - i) {
52                 ans += l - i;
53                 per(k, i, l) swap(s[k], s[k + 1]);
54             }
55             else {
56                 ans += j - r;
57                 rep(k, r, j) swap(s[k], s[k + 1]);
58             }
59         }
60         cout << ans << endl;
61     }
62     return 0;
63 }
时间: 2024-08-26 06:22:02

POJ 1854 贪心的相关文章

POJ 2231 贪心吗?怎么感觉像是数学。。。。

过了两次用了两种不同方法,其实也差不多,如果真的暴力去求得话铁定超时,(好像优化减去一些不可能的情况也能过,但是我没尝试)所以找一下规律咯,没学过算法的渣只能靠思维做题了... #include<stdio.h> int a[10009]; int main() { int n,m,t,i,j; long long sum; while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) scanf("%d

poj 1017(贪心)

[题目大意] 题目大意是这样的:某工厂生产几种产品,首先用packet包住,这些产品的高度都是h,底面积有1*1,2*2,3*3,4*4,5*5,6*6六种规格,下面我们要用高度为h,底面积为6*6的集装箱装这些货物,问怎样使所用集装箱数目最少? [解题思路] 我们首先必须先装底面积大的货物,并且对于面积为4*4,5*5,6*6的货物,每一件都需要一个独立的集装箱.对于底面积为3*3的货物,每四个需要一个集装箱. 那么我们可以得知对于装了底面积为3*3的货物的集装箱,其剩余可以装5,3,1个底面

POJ 3617 贪心

题目链接:http://poj.org/problem?id=3617 大致题意:给定一个字符串s,通过这个字符串来构造一个新的字符串t,从s的头部或者尾部删除一个小的字符加入t的尾部. 分析,我们很容易想到,直接判断头尾大小即可.可是,这样的话,如果头尾相等的话,那么对于哪一个先删去还是无法确定.这个时候我们就需要比较相等字符的前一个字符,如果还相等,那么继续比较..知道找到那个不等的字符,找到即跳出循环. 这段代码很精细.却不是我写的. 代码如下: 1 #include <cstdio>

Cleaning Shifts(POJ 2376 贪心)

Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15143   Accepted: 3875 Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one co

POJ 3040 贪心

链接: http://poj.org/problem?id=3040 题解: 1:大于c的就直接取: 2:如果小于就从大到小拿钱,能拿多少拿多少,但不能超过c: 3:如果2拿的钱小于c,就从小到大拿钱,能拿多少拿多少,但要求是超过c的时候是最小的,也就是说,这些钱的总和是大于c的最小数: 4:将此类取钱方式求出次数,加到ans中,然后返回第二步. 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #in

poj 1328 贪心

/* 贪心.... 处理处每个点按照最大距离在x轴上的映射 然后我们就有了一些线段 目的是选取尽量少的点 使得每个线段内都有点出现 我们按照左端点排序 然后逐一处理 假设第一个雷达安在第一个线段的右端点 若下一条与之无交点 则再按一个雷达 若完全覆盖 贪心的 我们把雷达移动到下一条的右端点 这样这个雷达就又多覆盖了一个岛 */ #include<iostream> #include<cstdio> #include<cstring> #include<algori

Supermarket poj 1456 贪心+并查集优化

Language: Default Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9512   Accepted: 4096 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is

Yogurt factory(POJ 2393 贪心 or DP)

Yogurt factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8205   Accepted: 4197 Description The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the next N (1 <= N <= 10,000) weeks, the price of milk

poj 2376 贪心 区间覆盖问题

题意: 给n个区间 选择尽量少的区间 覆盖1~T这个区间 如果不能覆盖 输出-1 思路: 经典贪心 区间覆盖 将所有区间按照起点从小到大排序 取终点在最右边的那个区间 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<queue>