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$,那 ...
随机推荐
- 2019-5-28-VisualStudio-扩展开发
title author date CreateTime categories VisualStudio 扩展开发 lindexi 2019-05-28 19:51:49 +0800 2018-2-1 ...
- .net core api迁移 3.0后Post 405 Method Not Allowed
问题由来:.net core api之前是用 .net core 2.0开发的,测试过都是正常的,近期升级到了3.0,发现api get正常,post提示400,405 Method Not Allo ...
- tomcat日志切割脚本shell
tomcat-rotate.sh: #!/bin/bash log_path="/home/tomcat7-api/logs/"expried_time=7 function de ...
- pandas数据读取(DataFrame & Series)
1.pandas数据的读取 pandas需要先读取表格类型的数据,然后进行分析 数据说明 说明 pandas读取方法 csv.tsv.txt 用逗号分割.tab分割的纯文本文件 pd.read_csv ...
- 项目中dubbo的标准配置
# Spring boot applicationspring: application: name: hello-dubbo-service-user-provider # UserService ...
- RMQ HelloWorld
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11791681.html Project Directory Maven Dependency < ...
- 卷积神经网络(Text--cnn)(知识点整理)
参考:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ 独热编码(one- ...
- fast
# connect timeout in seconds# default value is 30sconnect_timeout=30 # network timeout in seconds# d ...
- python之路----操作系统的发展史
阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...
- Prefix
Prefix 南昌邀请赛的题,字典树 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll A[]; ...