杭电2019多校第一场,Problem I,String 2019

题目描述
Tom has a string containing only lowercase letters. He wants to choose a subsequence of the string whose length is k and lexicographical order is the smallest. It's simple and he solved it with ease.
But Jerry, who likes to play with Tom, tells him that if he is able to find a lexicographically smallest subsequence satisfying following 26 constraints, he will not cause Tom trouble any more.
The constraints are: the number of occurrences of the ith letter from a to z (indexed from 1 to 26) must in [Li,Ri].
Tom gets dizzy, so he asks you for help.
 

 

输入
The input contains multiple test cases. Process until the end of file.
Each test case starts with a single line containing a string S(|S|≤10 5)and an integer k(1≤k≤|S|).
Then 26 lines follow, each line two numbers Li,Ri(0≤Li≤Ri≤|S|). 
It's guaranteed that S consists of only lowercase letters, and ∑|S|≤3×10 5.

 

输出
Output the answer string.
If it doesn't exist, output −1.

样例输入

aaabbb 3
0 3
2 3
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
0 0
0 0
0 0
样例输出
abb
题解:
将字母下标按字母从前往后依次抽取出来;
然后从前往后依次确定k的每一位应该放的字母;
对于每一位,枚举字母的顺序应该是从a到z,接着判断该字母放上去后是否符合条件,符合则去确定k的下一位字母,不符合则继续循环;
时间复杂度应该是O(26*26*n)。
AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+50;
 4 int suf_sum[maxn][30],l[30],r[30],used[30],n,k,last;
 5 char str[maxn],res[maxn];
 6 vector<int> letter_index[30];
 7 int main()
 8 {
 9     while(scanf("%s %d",str,&k)!=EOF)
10     {
11         for(int i=0;i<=25;i++){
12             scanf("%d %d",&l[i],&r[i]);
13             letter_index[i].clear();
14         }
15         vector<int> ::iterator head[30];
16         memset(used,0,sizeof(used));
17         n=strlen(str);last=-1;
18         for(int i=0;i<=n;i++) for(int j=0;j<=25;j++) suf_sum[i][j]=0;
19         for(int i=n-1;i>=0;i--){
20             for(int j=0;j<=25;j++){
21                 if(str[i]=='a'+j) suf_sum[i][j]=suf_sum[i+1][j]+1;
22                 else suf_sum[i][j]=suf_sum[i+1][j];
23             }
24         }
25         for(int i=0;i<=n-1;i++){
26             letter_index[str[i]-'a'].push_back(i);
27         }
28         for(int i=0;i<=25;i++){
29             head[i]=letter_index[i].begin();
30         }
31         bool ans=true;
32         for(int i=0;i<=k-1;i++){
33             bool flag=false;
34             for(int j=0;j<=25;j++){
35                 if(used[j]==r[j]) continue;
36                 while(head[j]!=letter_index[j].end() && (*head[j])<=last) head[j]++;
37                 if(head[j]==letter_index[j].end()) continue;
38                 used[j]++;
39                 bool tag=true;
40                 int cnt=0,tmp=0,pos=(*head[j]);
41                 for(int t=0;t<=25;t++){
42                     if(suf_sum[pos+1][t]+used[t]<l[t]) tag=false;
43                     cnt+=max(0,l[t]-used[t]);
44                     tmp+=min(suf_sum[pos+1][t],r[t]-used[t]);
45                 }
46                 if(cnt>k-1-i || tmp<k-1-i) tag=false;
47                 if(!tag) used[j]--;
48                 else{
49                     res[i]='a'+j;
50                     last=pos;
51                     flag=true;
52                     break;
53                 }
54             }
55             if(!flag){
56                 ans=false;
57                 printf("-1\n");
58                 break;
59             }
60         }
61         if(ans){
62             res[k]='\0';
63             printf("%s\n",res);
64         }
65     }
66     return 0;
67 }
68 /*
69 aaccddaa 6
70 2 4
71 0 0
72 2 2
73 0 2
74 0 0
75 0 0
76 0 0
77 0 0
78 0 0
79 0 0
80 0 0
81 0 0
82 0 0
83 0 0
84 0 0
85 0 0
86 0 0
87 0 0
88 0 0
89 0 0
90 0 0
91 0 0
92 0 0
93 0 0
94 0 0
95 0 0
96 */
View Code
 
 

转载于:https://www.cnblogs.com/lglh/p/11250140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2019高教社杯全国大学生数学建模竞赛题目 (请先阅读“全国大学生数学建模竞赛论文格式规范”) A题 高压油管的压力控制 燃油进入和喷出高压油管是许多燃油发动机工作的基础,图1给出了某高压燃油系统的工作原理,燃油经过高压油泵从A处进入高压油管,再由喷口B喷出。燃油进入和喷出的间歇性工作过程会导致高压油管内压力的变化,使得所喷出的燃油量出现偏差,从而影响发动机的工作效率。 图1 高压油管示意图 问题1. 某型号高压油管的内腔长度为500mm,内直径为10mm,供油入口A处小孔的直径为1.4mm,通过单向阀开关控制供油时间的长短,单向阀每打开一次后就要关闭10ms。喷油器每秒工作10次,每次工作时喷油时间为2.4ms,喷油器工作时从喷油嘴B处向外喷油的速率如图2所示。高压油泵在入口A处提供的压力恒为160 MPa,高压油管内的初始压力为100 MPa。如果要将高压油管内的压力尽可能稳定在100 MPa左右,如何设置单向阀每次开启的时长?如果要将高压油管内的压力从100 MPa增加到150 MPa,且分别经过约2 s、5 s和10 s的调整过程后稳定在150 MPa,单向阀开启的时长应如何调整? 图2 喷油速率示意图 问题2. 在实际工作过程中,高压油管A处的燃油来自高压油泵的柱塞腔出口,喷油由喷油嘴的针阀控制。高压油泵柱塞的压油过程如图3所示,凸轮驱动柱塞上下运动,凸轮边缘曲线与角度的关系见附件1。柱塞向上运动时压缩柱塞腔内的燃油,当柱塞腔内的压力大于高压油管内的压力时,柱塞腔与高压油管连接的单向阀开启,燃油进入高压油管内。柱塞腔内直径为5mm,柱塞运动到上止点位置时,柱塞腔残余容积为20mm3。柱塞运动到下止点时,低压燃油会充满柱塞腔(包括残余容积),低压燃油的压力为0.5 MPa。喷油器喷嘴结构如图4所示,针阀直径为2.5mm、密封座是半角为9°的圆锥,最下端喷孔的直径为1.4mm。针阀升程为0时,针阀关闭;针阀升程大于0时,针阀开启,燃油向喷孔流动,通过喷孔喷出。在一个喷油周期内针阀升程与时间的关系由附件2给出。在问题1中给出的喷油器工作次数、高压油管尺寸和初始压力下,确定凸轮的角速度,使得高压油管内的压力尽量稳定在100 MPa左右。 图3 高压油管实际工作过程示意图 图4 喷油器喷嘴放大后的示意图 问题3. 在问题2的基础上,再增加一个喷油嘴,每个喷嘴喷油规律相同,喷油和供油策略应如何调整?为了更有效地控制高压油管的压力,现计划在D处安装一个单向减压阀(图5)。单向减压阀出口为直径为1.4mm的圆,打开后高压油管内的燃油可以在压力下回流到外部低压油路中,从而使得高压油管内燃油的压力减小。请给出高压油泵和减压阀的控制方案。 图5 具有减压阀和两个喷油嘴时高压油管示意图 注1. 燃油的压力变化量与密度变化量成正比,比例系数为E/ρ,其中ρ为燃油的密度,当压力为100 MPa时,燃油的密度为0.850 mg/mm3。E为弹性模量,其与压力的关系见附件3。 注2. 进出高压油管的流量为Q=CA√(2ΔP/ρ),其中Q为单位时间流过小孔的燃油量(mm3/ms),C=0.85为流量系数,A为小孔的面积(mm2),ΔP为小孔两边的压力差(MPa),ρ为高压侧燃油的密度(mg/mm3)。 附件1:凸轮边缘曲线 附件2:针阀运动曲线 附件3:弹性模量与压力的关系

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值