[CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)
题目链接:http://codeforces.com/contest/752/problem/D
题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串。使得权值最大。
因为字符串长度都一样,所以想构成回文串,必须两两配对,在中间加或者不加一个本身就是回文的字符串。
1.考虑非回文串的配对,把所有可以构成回文的非回文串凑起来,必须两两权值和>0才有意义。那么就扔到优先队列里配对。
2.考虑回文串的配对,配对成功的话要看下是不是两个回文串都是>0,如果不是,要额外在一个vector里记下,方便后面用。
3.这时候挑一个>0的,备选放在中间。
比较上面的2.3,求最优。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- typedef pair<LL, LL> pll;
- const int maxn = ;
- int n, k, tmp;
- char s[maxn];
- vector<string> str, rev;
- map<string, priority_queue<LL> > wt;
- int main() {
- // freopen("in", "r", stdin);
- while(~scanf("%d%d",&n, &k)) {
- wt.clear(); str.clear(); rev.clear();
- for(int i = ; i < n; i++) {
- scanf("%s %d", s, &tmp);
- str.push_back(s);
- rev.push_back(s);
- reverse(rev[i].begin(), rev[i].end());
- wt[s].push(tmp);
- }
- LL ret = ;
- for(int i = ; i < str.size(); i++) {
- if(str[i] != rev[i]) {
- while(wt[str[i]].size() > && wt[rev[i]].size() > ) {
- int x = wt[str[i]].top();
- wt[str[i]].pop();
- int y = wt[rev[i]].top();
- wt[rev[i]].pop();
- if(x + y > ) ret += x + y;
- else {
- if(x > ) wt[str[i]].push(x);
- if(y > ) wt[rev[i]].push(y);
- break;
- }
- }
- }
- }
- vector<pll> tmp;
- for(int i = ; i < str.size(); i++) {
- if(str[i] == rev[i]) {
- while(wt[str[i]].size() > ) {
- int x = wt[str[i]].top();
- wt[str[i]].pop();
- int y = wt[str[i]].top();
- wt[str[i]].pop();
- if(x + y > ) {
- ret += x + y;
- if(x > && y > ) continue;
- if(x > y) swap(x, y);
- tmp.push_back(pll(x, y));
- }
- else {
- if(x > ) wt[str[i]].push(x);
- if(y > ) wt[str[i]].push(y);
- break;
- }
- }
- }
- }
- LL aa = maxn, bb;
- for(int i = ; i < tmp.size(); i++) {
- if(tmp[i].first < aa) {
- aa = tmp[i].first;
- bb = tmp[i].second;
- }
- // cout << tmp[i].first << " " << tmp[i].second << endl;
- }
- LL qq = ;
- for(int i = ; i < str.size(); i++) {
- if(str[i] == rev[i]) {
- if(wt[str[i]].size() > ) {
- if(wt[str[i]].top() > ) {
- qq = max(qq, wt[str[i]].top());
- }
- }
- }
- }
- if(aa == maxn) cout << max(ret + qq, ret) << endl;
- else cout << max(max(ret, ret + qq), ret - LL(aa)) << endl;
- }
- return ;
- }
[CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)的更多相关文章
- Santa Claus and a Palindrome
Santa Claus and a Palindrome 题目链接:http://codeforces.com/contest/752/problem/D 贪心 很自然地,可以想到,若subS不是回文 ...
- 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 ...
- 【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 - 748D Santa Claus and a Palindrome (贪心+构造)
题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的 ...
- Codeforces 748D Santa Claus and a Palindrome
雅礼集训期间我好像考完试就开始划水了啊 给出k个长度相同的字符串,每个串有一个权值,选出一些串连成一个回文串.使得选中的串的总权值最大. 如果选一个串,必须同时选一个对称的串.还有一个特殊情况是可以在 ...
- cf 478D.Santa Claus and a Palindrome
原来set,priority_queue也可以映射..涨姿势2333 比较麻烦的应该就是判断自身回文的串是选2个还是选一个吧. #include<bits/stdc++.h> #defin ...
- CodeForces 509C Sums of Digits(贪心乱搞)题解
题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...
- [luoguP1053] 篝火晚会(贪心 + 乱搞)
传送门 假设第一个位置是1,那么枚举它的左右两边是谁,有两种情况,然后可以递推求出序列. 然后可以贪心,两个序列有多少个不同的数,答案就是多少,具体为啥,yy一下即可 然后就是判断递推求出的序列和目标 ...
随机推荐
- Docker入门简介
Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们的应用和依赖包到一个可一直的容器中,然后 ...
- mac 安装jdk1.5
前期准备 Java安装包 JDK 1.5:Java for Mac OS X 10.5 Update 10(From: Apple) 辅助工具 Pacifist:用于提取*.dmg安装包中的文件(点我 ...
- C语言堆和栈
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...
- FTF登入tiny210开发板
配置环境一: 第一步:安装虚拟机 1)安装虚拟机+Linux12.04 2)安装FTP软件 第二步:配置超级终端(串口) 1)开 ...
- 4. 什么是AJAX
术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验.在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步.Ajax提供与服务器 ...
- 将HTML5封装成android应用APK文件的几种方法(转载)
越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...
- 夺命雷公狗-----React---25--小案例之react经典案例todos(单选框的修改)
还是老样子,首先给li里面的单选框一个函数,然后通过props来对她进行处理 然后在ul里面对父组建进行传送 补充一下啊第一步,因为到时候要用到index属性,所以我们需要发送多一个index过来 然 ...
- 10分钟学习pandas
10 Minutes to pandas This is a short introduction to pandas, geared mainly for new users. You can se ...
- vs2010问题:未能安装xxx包
打开vs2010新建c++工程,出现问题如图 原因是重复安装了,之前安装的没有删除干净,导致冲突. 如果你的vs2010安装在c盘,解决方法:http://blog.sina.com.cn/s/blo ...
- Material Design Lite,简洁惊艳的前端工具箱 之 交互组件。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, 博客地址为http://www.cnblogs.com/jasonnode/ . 网站上有对应 ...