标签:string 部分 提前 size int getchar esc cost using
Description
Solution
考试的时候并没有想到QAQ
正解应该是三分啦…但是直接枚举Deadline线性可做
具体实现见代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define MAXN 100005 #define INF 1e16 typedef long long LL; using namespace std; int n,m,a,b,c; LL student[MAXN],course[MAXN]; int read() { int x=0;char c=getchar(); while(c<‘0‘||c>‘9‘)c=getchar(); while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar(); return x; } int main() { a=read(),b=read(),c=read(),n=read(),m=read(); int day=0;LL cost=0,mov=0,left=0,ans; for(int i=1;i<=n;i++) {int t;t=read();student[t]++;day=max(day,t);} for(int i=1;i<=m;i++) {int t;t=read();course[t]++;day=max(day,t);} for(int i=1;i<=day;i++) { cost+=student[i]*(day-i); left+=course[i]*(day-i); student[i]+=student[i-1];//维护前缀和 course[i]+=course[i-1]; } ans=cost*c; for(int i=day-1;i>0;i--) { mov+=(m-course[i]);//在这天后完结的课需要向前移动一天 left-=course[i];//前面的所有课程向后移动的范围减少了1天 cost-=student[i];//减掉希望在这天以前完结的学生一天的不满意度 if(c>=INF&&cost)continue; LL p=left>0?left:0; if(mov<p)p=mov; if(a<b)ans=min(ans,p*a+(mov-p)*b+cost*c); else ans=min(ans,mov*b+cost*c); } printf("%lld\n",ans); return 0; }
[BZOJ 4868][SHOI&SXOI2017]期末考试(贪心)
标签:string 部分 提前 size int getchar esc cost using
原文地址:http://www.cnblogs.com/Zars19/p/6792581.html