并不对劲的bzoj4868: [Shoi2017]期末考试
三分裸题。
发现答案只和最后一个科目公布成绩的时间有关。
科目公布成绩的时间越早,老师们的不愉快度越高,这个时间越晚,学生们的不愉快度越高。
它看上去像个单峰的,那么就三分好了。
判断时就是个简单的贪心。对于结束时间T,A>B时,让所有T后结束的科目的老师花B的不愉快度加速;B>A时,让所有T后结束的科目花A的不愉快度接受T前结束的科目老师,剩下的再花B的不愉快度加速。再统计学生的不愉快度,就能求出总不愉快度了。
据说三分、二分的题,看出它是道三分或二分的题就已经完成了一半。
1 #include<algorithm> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<iomanip> 7 #include<iostream> 8 #include<map> 9 #include<vector> 10 #include<queue> 11 #include<stack> 12 #define rep(i,x,y) for(register ULL i=(x);i<=(y);++i) 13 #define dwn(i,x,y) for(register ULL i=(x);i>=(y);--i) 14 #define maxn 100010 15 #define ULL unsigned long long 16 using namespace std; 17 ULL read() 18 { 19 ULL x=0,f=1;char ch=getchar(); 20 while(!isdigit(ch)&&ch!='-')ch=getchar(); 21 if(ch=='-')f=-1,ch=getchar(); 22 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 23 return x*f; 24 } 25 void write(ULL x) 26 { 27 char ch[30];ULL f=0; 28 if(!x){puts("0");return;} 29 if(x<0){putchar('-');x=-x;} 30 while(x)ch[++f]=x%10+'0',x/=10; 31 while(f)putchar(ch[f--]); 32 putchar('\n'); 33 } 34 ULL t[maxn],b[maxn],A,B,C,n,m,minc=-1; 35 ULL three=3,two=2,one=1; 36 void upd(ULL x){minc=minc==-1?x:min(x,minc);} 37 ULL getans(ULL T) 38 { 39 // cout<<"T:"<<T<<" "; 40 ULL ans=0,tmp1=0,tmp2=0; 41 rep(i,1,m) 42 { 43 if(b[i]<=T)tmp1+=T-b[i]; 44 else tmp2+=b[i]-T; 45 } 46 if(tmp1<tmp2)ans=tmp1*A+(tmp2-tmp1)*B; 47 else ans=tmp2*A; 48 ans=min(ans,tmp2*B); 49 rep(i,1,n)if(t[i]<T)ans+=(T-t[i])*C; 50 return ans; 51 } 52 int main() 53 { 54 A=read(),B=read(),C=read(); 55 n=read(),m=read(); 56 rep(i,1,n)t[i]=read(); 57 rep(i,1,m)b[i]=read(); 58 sort(t+1,t+n+1),sort(b+1,b+m+1); 59 ULL L=1,R=b[m]; 60 while(R-L>=5) 61 { 62 ULL lm=(R-L+one)/three+L,rm=(R-L+one)*two/three+L; 63 //cout<<L<<" "<<lm<<" "<<rm<<" "<<R<<endl; 64 ULL lans=getans(lm),rans=getans(rm); 65 upd(lans),upd(rans); 66 if(lans>rans) L=lm; 67 else R=rm; 68 } 69 rep(i,L,R)upd(getans(i)); 70 write(minc); 71 return 0; 72 } 73 /* 74 100 100 2 75 4 5 76 5 1 2 3 77 1 1 2 3 3 78 */ 79 /* 80 3 5 4 81 5 6 82 1 1 4 7 8 83 2 3 3 1 8 2 84 */
以下与本题无关,勿看。
顺便说一些很令人不快的事情。
总有些人盲目地膜别人或者装弱,这听上去毫无意义。这样别人并不会觉得那个人有多谦虚,反而会很反感。这能够给乱膜者带来的弊大于利,他们也很清楚这一点,却还是要膜。这是为什么?我自以为,有的人可能是看着周围人都这么做,不想显得不合群,就也跟风模仿。也有人看着别人总膜自己,觉得不好意思,就也用同样的方式对付别人,这样就不会太别扭。这些只是被动的、不得不膜的人。但还有一些主动膜的人,才是带动盲目膜的不良风气的主力军。他们多半实力不低,却偏要以阴阳怪气的语气和奇怪的动作来贬低自己、抬高别人。这些可能只是被他们当成吸引别人注意的一种新奇手段。他们的另一个目的也不是在于表示谦虚,而是在于别人被膜之后说的“您那么强,怎么会弱呢”、“我比您菜多了”之类的话给他们带来的成就感。这一点上,就相当于是借对方之口嘲讽对方,给对方带来的困扰远多于直接批评讽刺。拒绝乱膜,从我做起!