Educational Codeforces Round 8 C. Bear and String Distance(贪心)
2016-02-22 21:40
405 查看
题意:
给定N≤105的字符串,定义字符距离dist(a,b)=abs(a−b)
求一个同样长度的但是距离总和为K≤106的字符串
分析:
按照距离大小排序,然后贪心的从大到小搞就可以了
其实我想多了,不用排序直接搞就行了−−
代码:
给定N≤105的字符串,定义字符距离dist(a,b)=abs(a−b)
求一个同样长度的但是距离总和为K≤106的字符串
分析:
按照距离大小排序,然后贪心的从大到小搞就可以了
其实我想多了,不用排序直接搞就行了−−
代码:
// // Created by TaoSama on 2016-02-21 // Copyright (c) 2016 TaoSama. All rights reserved. // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; char s , ans ; int n, k, r ; bool cmp(int x, int y) { return max(abs('a' - s[x]), abs('z' - s[x])) < max(abs('a' - s[y]), abs('z' - s[y])); } void solve(int i, int a, int d, int& leave) { if(leave > a) { leave -= a; ans[i] = s[i]; } else { if(d > 0) ans[i] = 'a' + leave; else ans[i] = 'z' - leave; leave = 0; } // printf("%d: %c %c\n", i, s[i], ans[i]); } int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); while(scanf("%d%d%s", &n, &k, s + 1) == 3) { int dif = 0; for(int i = 1; i <= n; ++i) dif += max(abs('a' - s[i]), abs('z' - s[i])); if(dif < k) {puts("-1"); continue;} int leave = dif - k; for(int i = 1; i <= n; ++i) r[i] = i; sort(r + 1, r + 1 + n, cmp); memset(ans, 0, sizeof ans); for(int i = n; i; --i) { if(!leave) break; int j = r[i]; int a = abs('a' - s[j]), z = abs('z' - s[j]); if(a > z) solve(j, a, 1, leave); else solve(j, z, -1, leave); } for(int i = 1; i <= n; ++i) { if(ans[i]) putchar(ans[i]); else putchar("az"[abs('a' - s[i]) < abs('z' - s[i])]); } puts(""); } return 0; }
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻