CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)
题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大。
分析:
1、若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的魅力值分别从大到小排序后,若两者之和大于0,则可以放在回文串的两边。
2、若某字符串是回文串,将其魅力值从大到小排序后,两两依次分析:(mid---可能放在回文串中间的串的最大魅力值)
(1)若两个数都是正的,那么就将其放在两边,并将结果计入ans。(ans---回文串两边的串的魅力值之和)
(2)若一正一负,且正数绝对值大,可以放在两边,也可以将正数放在中间同时舍去负数。
那么先假定这两个数是放在两边的,并将结果计入ans。
若该正数放在回文串的中间最终是mid的最大值,那么实际上结果增加了是负数的绝对值,所以将负数的绝对值与mid比较,并更新。
eg:
(i)aaa:5,-3;bbb:4;
aaa放在中间相对于放在两边最终的结果是增加了3,而bbb放在中间最终的结果是增加了4,所以aaa应当放在两边,而且中间的串应取bbb。
(ii)aaa:5,-3;bbb:2;
aaa放在中间相对于放在两边最终的结果是增加了3,而bbb放在中间最终的结果是增加了2,所以aaa放在中间是最好的情况,mid应取3。
(3)若一正一负,且负数绝对值大,那么一定不能放在两边(因为两者之和小于0),但正数可以放在中间,更新mid。
(4)若两数都是负的,那么不放进回文串。
- #pragma comment(linker, "/STACK:102400000, 102400000")
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cctype>
- #include<cmath>
- #include<iostream>
- #include<sstream>
- #include<iterator>
- #include<algorithm>
- #include<string>
- #include<vector>
- #include<set>
- #include<map>
- #include<stack>
- #include<deque>
- #include<queue>
- #include<list>
- #define Min(a, b) ((a < b) ? a : b)
- #define Max(a, b) ((a < b) ? b : a)
- const double eps = 1e-8;
- inline int dcmp(double a, double b){
- if(fabs(a - b) < eps) return 0;
- return a > b ? 1 : -1;
- }
- typedef long long LL;
- typedef unsigned long long ULL;
- const int INT_INF = 0x3f3f3f3f;
- const int INT_M_INF = 0x7f7f7f7f;
- const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
- const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
- const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
- const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
- const int MOD = 1e9 + 7;
- const double pi = acos(-1.0);
- const int MAXN = 100000 + 10;
- const int MAXT = 1000000 + 10;
- using namespace std;
- map<string, int> mp;
- vector<int> v[MAXN];
- vector<string> t;
- int k, n;
- string s;
- int cnt;
- int vis[MAXN];
- void init(){
- cnt = 0;
- for(int i = 0; i < MAXN; ++i) v[i].clear();
- mp.clear();
- memset(vis, 0, sizeof vis);
- t.clear();
- }
- int get_id(string x){
- if(mp.count(x)) return mp[x];
- return mp[x] = ++cnt;
- }
- bool judge(string x){
- for(int i = 0; i < n / 2; ++i)
- if(x[i] != x[n - i - 1]) return false;
- return true;
- }
- int main(){
- while(scanf("%d%d", &k, &n) == 2){
- init();
- for(int i = 0; i < k; ++i){
- cin >> s;
- int id = get_id(s);
- int value;
- scanf("%d", &value);
- v[id].push_back(value);
- if(judge(s)) vis[id] = -1;//回文串
- else{
- t.push_back(s);//非回文串
- }
- }
- int l = t.size();
- for(int i = 0; i < l; ++i){
- string tt = t[i];
- reverse(t[i].begin(), t[i].end());
- if(mp.count(t[i])){
- vis[mp[tt]] = mp[t[i]];
- }
- }
- int ans = 0;
- int mid = 0;
- for(int i = 1; i <= cnt; ++i){
- if(!vis[i]) continue;
- if(vis[i] != -1){//非回文串且有对称串
- vis[vis[i]] = 0;
- int tmp_id = vis[i];
- int len = Min(v[i].size(), v[tmp_id].size());
- sort(v[i].begin(), v[i].end(), greater<int>());
- sort(v[tmp_id].begin(), v[tmp_id].end(), greater<int>());
- for(int j = 0; j < len; ++j){
- if(v[i][j] + v[tmp_id][j] > 0) ans += v[i][j] + v[tmp_id][j];
- else break;
- }
- }
- else{
- int len = v[i].size();
- if(len == 1){
- mid = Max(mid, v[i][0]);
- continue;
- }
- sort(v[i].begin(), v[i].end(), greater<int>());
- for(int j = 0; j < len; j += 2){
- if(j + 1 < len){
- if(v[i][j] + v[i][j + 1] > 0){
- ans += v[i][j] + v[i][j + 1];
- if(v[i][j] >= 0 && v[i][j + 1] < 0){
- mid = Max(mid, -v[i][j + 1]);
- }
- else if(v[i][j] < 0 && v[i][j + 1] >= 0){
- mid = Max(mid, -v[i][j]);
- }
- }
- else{
- if(v[i][j] >= 0){
- mid = Max(mid, v[i][j]);
- }
- else if(v[i][j + 1] >= 0){
- mid = Max(mid, v[i][j + 1]);
- }
- else break;
- }
- }
- else{
- if(v[i][j] > 0) mid = Max(mid, v[i][j]);
- }
- }
- }
- }
- printf("%d\n", ans + mid);
- }
- return 0;
- }
CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)的更多相关文章
- Codeforces 748D Santa Claus and a Palindrome
雅礼集训期间我好像考完试就开始划水了啊 给出k个长度相同的字符串,每个串有一个权值,选出一些串连成一个回文串.使得选中的串的总权值最大. 如果选一个串,必须同时选一个对称的串.还有一个特殊情况是可以在 ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) D. Santa Claus and a Palindrome STL
D. Santa Claus and a Palindrome time limit per test 2 seconds memory limit per test 256 megabytes in ...
- Santa Claus and a Palindrome
Santa Claus and a Palindrome 题目链接:http://codeforces.com/contest/752/problem/D 贪心 很自然地,可以想到,若subS不是回文 ...
- 【Codeforces752D】Santa Claus and a Palindrome [STL]
Santa Claus and a Palindrome Time Limit: 20 Sec Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...
- Codeforces Round #389 Div.2 D. Santa Claus and a Palindrome
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces 752C - Santa Claus and Robot - [简单思维题]
题目链接:http://codeforces.com/problemset/problem/752/C time limit per test 2 seconds memory limit per t ...
- codeforces 748E Santa Claus and Tangerines
E. Santa Claus and Tangerines time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- Codeforces 784B Santa Claus and Keyboard Check
题面: 传送门 B. Santa Claus and Keyboard Check Input file: standard input Output file: standard output Time ...
- [CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)
题目链接:http://codeforces.com/contest/752/problem/D 题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串.使得权值最大. 因为字符串长度都 ...
随机推荐
- flutter如何使用配置文件pubspec.yaml(位于项目根目录)来管理第三方依赖包
官方文档 在软件开发中,很多时候有一些公共的库或SDK可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率.很多编程语言或开发工具 ...
- 管理和安装 chart【转】
安装 chart 当我们觉得准备就绪,就可以安装 chart,Helm 支持四种安装方法: 安装仓库中的 chart,例如:helm install stable/nginx 通过 tar 包安装,例 ...
- 数十万PhpStudy用户被植入后门,快来检测你是否已沦为“肉鸡”!
北京时间9月20日,杭州公安发布<杭州警方通报打击涉网违法犯罪暨‘净网2019’专项行动战果>一文,文章曝光了国内知名PHP调试环境程序集成包“PhpStudy软件”遭到黑客篡改并植入“后 ...
- SpringBoot#ConfigurationProperties注解相关的一些知识
用途:ConfigurationProperties注解,用于在spring环境定义bean的时候.通过这个注解,把配置文件中的相关属性注入到实例化的bean中. 原理:spring中bean的生命周 ...
- html基础与入门
html就是指一个html文件,它是由各种标签组成的 html分为 < !DOCTYPE html > 和 Head 和 Body Head title+meta+link+style B ...
- 013.CI4框架CodeIgniter数据库操作之:查询数据库,并让数据以数组的方式返回查询结果
01. 我们在CI4框架中的Model文件夹新建一个User_model.php的文件,使用的是getResultArray,表示并让数据以数组的方式返回查询结果,代码如下: <?php nam ...
- C++远征--jame_yuan(慕课网)
int &a=b;引用符 int const a = 3; int *p = &a; 只读 不能 赋给 读写 有默认参数值得参数必须在参数表的最右端 void fun(int ...
- P1004 成绩排名
转跳点:
- 微信小程序实现左滑删除效果(原生/uni-app)
实现效果 列表中侧滑删除 删除不同时存在 scrollview上下滑动与侧滑删除不影响 uni-app实现 html部分 <template> <scroll-view :scrol ...
- bzoj 1369: [Baltic2003]Gem
确实是神2333333333,一开始以为是01染色sb题,然而被打脸... (蒟蒻不乱说,网上各种神犇的题解,还有图!!) #include <bits/stdc++.h> #define ...