Week 11 T4
Posted pedestrian6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Week 11 T4相关的知识,希望对你有一定的参考价值。
问题描述】
众所周知,衡量一个编译器是否优秀的标准,除了它的编译速度和正确性以外,编译出的代码的质量也很重要。最近,作为XCC系列编译器作者的Dr. X发明了一种跨时代的优化算法:“NanGe不等式优化”。一个程序可以看成是由若干个连续的函数构成的,NanGe不等式算法能针对某一个函数进行优化,得到一个优化效果值, 不同的函数的效果值可能是不同的。但这个算法还有一个很大的Bug: _该算法不能同时优化相邻的两个函数,否则就会直接Compile Error,值得注意的是,一个程序的第一个函数和最后一个函数也算是相邻的。 _现在给你一个程序从头到尾每个函数的优化效果值,Dr. X想用NanGe不等式对该程序的M个函数进行优化,他该怎么选择才能使总的优化效果值最大(前提是不能出现错误)?如果错误不能避免,请输出“Error!”
【输入格式】
输入文件的第一行包含两个正整数n、m。
第二行为n个整数Ai。
【输出格式】
输出文件仅一个整数,表示最后对该程序进行优化后的最大效果值。如果无解输出“Error!”,不包含引号。
【样例输入1】
7 3
1 2 3 4 5 6 7
【样例输出1】
15
【样例输入2】
7 4
1 2 3 4 5 6 7
【样例输出2】
Error!
【数据范围与规定】
对于全部数据:m<=n;-1000<=Ai<=1000 N的大小对于不同数据有所不同:_
数据编号
N的大小 _
数据编号 _
N的大小 _
1
40
11
2013
2
45
12
5000
3
50
13
10000
4
55
14
49999
5
200
15
111111
6
200
16
148888
7
1000
17
188888
8
2010
18
199999
9
2011
19
199999
10
2012
20
200000
solution:一个类似于网络流反向弧的思想,一个数取过之后,就把它和左右两个数缩成一个点,权值为两边之和减去该数权值,如果再取相当于不取它取两边。set起堆的作用,贪心取最大,set方便删除
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #define N (200010)
5 using namespace std;
6 char S1[N],S2[N];
7 int n,m,T[N];
8 bool Check(int time){
9 int i,p=1;
10 for (i=1;i<=m;i++){
11 while ((S1[p]!=S2[i]||T[p]<=time)&&p<=n)
12 p++;
13 if (p>n) return 0;
14 p++;
15 }
16 return 1;
17 }
18 int main(){
19 cin>>(S1+1)>>(S2+1);
20 n=strlen(S1+1); m=strlen(S2+1);
21 int i;
22 for (i=1;i<=n;i++){
23 int x; scanf("%d",&x);
24 T[x]=i;
25 }
26 int l=1,r=n,ans=0;
27 while (l<=r){
28 int mid=(l+r)>>1;
29 if (Check(mid)) ans=mid,l=mid+1;
30 else r=mid-1;
31 }
32 cout<<ans;
33 }
以上是关于Week 11 T4的主要内容,如果未能解决你的问题,请参考以下文章