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 }

猜你喜欢

转载自www.cnblogs.com/Pedestrian6/p/9119009.html