好久没有水过杂题了!
今天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 ",ans); 27 }