2019 Multi-University Training Contest 1 - 1009 - String - 贪心
不知道错在哪里。
是要把atop改成stop!两个弄混了。感谢自造样例。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k;
char s[100005];
int cnt[100005][26];
deque<int> pos[26];
int l[26];
int r[26];
int used[26];
char ans[100005], atop;
bool check1(int id) {
//能不能放够下界
//id表示剩余序列的起始位置
int restlen = k - atop;
int sumli = 0;
for(int i = 0; i < 26; ++i) {
if(cnt[id][i] < l[i] - used[i])
return false;
sumli += l[i] - used[i];
}
if(sumli > restlen)
return false;
//上界加起来够不够放满?
int sumri = 0;
for(int i = 0; i < 26; ++i) {
sumri += r[i] - used[i];
}
if(sumri < restlen)
return false;
return true;
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%s%d", s + 1, &k)) {
for(int i = 0; i < 26; ++i) {
pos[i].clear();
used[i] = 0;
}
n = strlen(s + 1);
for(int i = 1; i <= n; ++i) {
pos[s[i] - 'a'].push_back(i);
for(int j = 0; j < 26; ++j) {
cnt[i][j] = 0;
}
++cnt[i][s[i] - 'a'];
}
for(int i = n - 1; i >= 1; --i) {
for(int j = 0; j < 26; ++j) {
cnt[i][j] += cnt[i + 1][j];
}
}
for(int i = 0; i < 26; ++i) {
scanf("%d%d", &l[i], &r[i]);
}
atop = 0;
bool suc2 = true;
while(atop < k) {
++atop;
//给第1个位置选
bool suc = false;
for(int i = 0; i < 26; i++) {
while(pos[i].size() && pos[i].front() < atop)
pos[i].pop_front();
if(used[i] < r[i] && pos[i].size()) {
used[i]++;
if(check1(pos[i].front() + 1)) {
suc = true;
ans[atop] = 'a' + i;
ans[atop + 1] = '\0';
pos[i].pop_front();
break;
}
used[i]--;
}
}
if(!suc) {
suc2 = false;
break;
}
}
if(suc2)
printf("%s\n", ans + 1);
else
puts("-1");
}
}
有一个可以导致出错的样例:
abcdeabcdeabcdeabcdeabcdeabcde 14
0 3
2 3
3 5
3 5
3 7
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
目前通过的代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k;
char s[100005];
int cnt[100005][26];
deque<int> pos[26];
int l[26], r[26], used[26];
char ans[100005];
int atop, stop;
bool check1(int id) {
//能不能放够下界
//id表示剩余序列的起始位置
int restlen = k - atop;
int sumli = 0;
for(int i = 0; i < 26; ++i) {
if(cnt[id][i] < l[i] - used[i])
return false;
sumli += max(l[i] - used[i], 0);
}
if(sumli > restlen)
return false;
//上界加起来够不够放满?
int sumri = 0;
for(int i = 0; i < 26; ++i) {
sumri += min(r[i] - used[i], cnt[id][i]);
}
if(sumri < restlen)
return false;
return true;
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
while(~scanf("%s%d", s + 1, &k)) {
memset(used, 0, sizeof(used));
n = strlen(s + 1);
for(int i = 0; i < 26; ++i) {
pos[i].clear();
used[i] = 0;
cnt[n + 1][i] = 0;
}
for(int i = 1; i <= n; ++i) {
pos[s[i] - 'a'].push_back(i);
for(int j = 0; j < 26; ++j) {
cnt[i][j] = 0;
}
++cnt[i][s[i] - 'a'];
}
for(int i = n - 1; i >= 1; --i)
for(int j = 0; j < 26; ++j)
cnt[i][j] += cnt[i + 1][j];
for(int i = 0; i < 26; ++i)
scanf("%d%d", &l[i], &r[i]);
atop = 0;
stop = 0;
bool suc2 = true;
while(atop < k) {
++atop;
//给第1个位置选
bool suc = false;
for(int i = 0; i < 26; i++) {
while(pos[i].size() && pos[i].front() <= stop)
pos[i].pop_front();
if(used[i] < r[i] && pos[i].size()) {
used[i]++;
if(check1(pos[i].front() + 1)) {
suc = true;
ans[atop] = 'a' + i;
ans[atop + 1] = '\0';
stop = pos[i].front();
pos[i].pop_front();
break;
}
used[i]--;
}
}
if(!suc) {
suc2 = false;
break;
}
}
ans[k + 1] = '\0';
if(suc2)
printf("%s\n", ans + 1);
else
puts("-1");
}
}
2019 Multi-University Training Contest 1 - 1009 - String - 贪心的更多相关文章
- 2019 Multi-University Training Contest 2 - 1009 - 回文自动机
http://acm.hdu.edu.cn/showproblem.php?pid=6599 有好几种实现方式,首先都是用回文自动机统计好回文串的个数. 记得把每个节点的cnt加到他的fail上,因为 ...
- 2015 Multi-University Training Contest 1 - 1009 Annoying problem
Annoying problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Mean: 给你一个有根树和一个节点集合 ...
- 2014 Multi-University Training Contest 9#1009
Just a JokeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tot ...
- hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...
- HDU 4608 I-number 2013 Multi-University Training Contest 1 1009题
题目大意:输入一个数x,求一个对应的y,这个y满足以下条件,第一,y>x,第二,y 的各位数之和能被10整除,第三,求满足前两个条件的最小的y. 解题报告:一个模拟题,比赛的时候确没过,感觉这题 ...
- 2015 Multi-University Training Contest 5 1009 MZL's Border
MZL's Border Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5351 Mean: 给出一个类似斐波那契数列的字符串序列 ...
- ACM多校联赛7 2018 Multi-University Training Contest 7 1009 Tree
[题意概述] 给一棵以1为根的树,树上的每个节点有一个ai值,代表它可以传送到自己的ai倍祖先,如果不存在则传送出这棵树.现在询问某个节点传送出这棵树需要多少步. [题解] 其实是把“弹飞绵羊”那道题 ...
- 2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...
- 2019 Nowcoder Multi-University Training Contest 1 H-XOR
由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...
随机推荐
- PHP: thinkPHP踩坑记录(实现API接口以及处理莫名其妙的500问题)
因为各种原因开始学习PHP,并且要在两周内能够对PHP项目进行二次开发,还好PHP够简单,至少入门很简单,很快就接触thinkPHP框架. 在了解了路由匹配视图的规则之后,开始着手尝试编写API接口, ...
- 【CF】38E Let's Go Rolling! (dp)
前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以 ...
- [python 学习] logging模块
1.将简单日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.war ...
- AOP技术介绍--(引言)
软件设计因为引入面向对象思想而逐渐变得丰富起来.“一切皆为对象”的精义,使得程序世界所要处理的逻辑简化,开发者可以用一组对象以及这些对象之间的关系将软件系统形象地表示出来.而从对象的定义,进而到模块, ...
- layui树形表格支持非异步和异步加载
layui树形表格支持非异步和异步加载. 仓库地址:https://gitee.com/uniqid/ 使用示例如下: <div class="uui-admin-common-bod ...
- 专家告诉你!如何避免黑客BGP劫持?
BGP前缀劫持是针对Internet组织的持久威胁,原因是域间路由系统缺乏授权和身份验证机制. 仅在2017年,数千起路由事件导致代价高昂的中断和信息拦截,而问题的确切程度未知.尽管在过去20年中已经 ...
- 选项卡jq
1.无定时器 $(function(){$('.banner-point li').on('click',function(){$(this).addClass('active').siblings( ...
- vim 批量添加删除注释
vim中单行注释只是多行注释的一个特例,这里统一进行多行注释的讲解 (1)添加批量注释 ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift+i) ...
- 学习日记4、datagrid多行删除
1.前台展现单选框datagrid代码 $('#List').datagrid({ url: '@Url.Action("GetList")', width: $(window). ...
- [CSP-S模拟测试]:Divisors(数学)
题目描述 给定$m$个不同的正整数$a_1,a_2,...,a_m$,请对$0$到$m$每一个$k$计算,在区间$[1,n]$里有多少正整数是$a$中恰好$k$个数的约数. 输入格式 第一行包含两个正 ...