期末考试(正解:三分单峰函数 me:暴力水过)

Posted hzoi-lsc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期末考试(正解:三分单峰函数 me:暴力水过)相关的知识,希望对你有一定的参考价值。

好久没有水过杂题了!

今天lsc终于刚过了三道考试题来水杂题了!

期末考试

技术图片

 

首先一看还是一脸mb(这是正常现象,毕竟我不像一些大神可以一眼出正解)然后我就被颓了标签,知道是三分单峰函数,但是自己实在是太弱了,所以并不会使用三分来水题,就只能使用暴力来做;

我们知道最后的恶心度(题里的不愉快度)是只和最后在那天出成绩有关,所以暴力枚举在哪天出成绩,然后使用前缀和就可以做到枚举1000000就可以出答案,其实就是取min就可以了!

如果A<B,那么显然使用第一种方法更优秀,而且我们可以O(1)算

然后就是要前缀和维护可以推迟的天数的和,最后再判一下就行了,注意long long 和 res>ans就跳出;

具体的看代码:

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int N=100005;
 5 ll ans=1ll<<62,A,B,C,s1,s2,s3,s4,res=0;
 6 int n,m,t[N],b[N];
 7 int main()
 8 
 9     scanf("%lld%lld%lld%d%d",&A,&B,&C,&n,&m);
10     for(int i=1,x;i<=n;i++)scanf("%d",&x),t[x]++;
11     for(int i=1,x;i<=m;i++)scanf("%d",&x),b[x]++,s3+=x;
12     for(int T=1;T<=100000;T++)
13     
14         res+=s1*C;//恶心程度!
15         s1+=t[T];//到这一天期望出分数的个数!其实是等待已经到达极点的人数!
16         if(res>=ans)break;
17         s4+=s2;//小于i天的可以退迟的总天数!
18         s3-=(m-s2);//还没有出分的数目!
19         s2+=b[T];//在这一天之前出分的数目!
20         ll r;
21         if(B<=A)r=s3*B;//显然使用第二种方法好使
22         else if(s3<=s4)r=s3*A;//只有没有出分的小于出分的情况才可以使用一进行搞
23         else r=s4*A+(s3-s4)*B;//不然的话就混合搞!
24         ans=min(ans,res+r);
25     
26     printf("%lld\\n",ans);
27 
View Code

 

以上是关于期末考试(正解:三分单峰函数 me:暴力水过)的主要内容,如果未能解决你的问题,请参考以下文章

三分 BZOJ4868 [Sxoi2017] 期末考试

[BZOJ4868][六省联考2017]期末考试(三分)

BZOJ4868期末考试(整数三分)

BZOJ 4868 [Shoi2017]期末考试 ——三分 枚举

bzoj4868期末考试

AtCoderARC096(C - F)