并不对劲的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('
');
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 */
View Code

以下与本题无关,勿看。


顺便说一些很令人不快的事情。

总有些人盲目地膜别人或者装弱,这听上去毫无意义。这样别人并不会觉得那个人有多谦虚,反而会很反感。这能够给乱膜者带来的弊大于利,他们也很清楚这一点,却还是要膜。这是为什么?我自以为,有的人可能是看着周围人都这么做,不想显得不合群,就也跟风模仿。也有人看着别人总膜自己,觉得不好意思,就也用同样的方式对付别人,这样就不会太别扭。这些只是被动的、不得不膜的人。但还有一些主动膜的人,才是带动盲目膜的不良风气的主力军。他们多半实力不低,却偏要以阴阳怪气的语气和奇怪的动作来贬低自己、抬高别人。这些可能只是被他们当成吸引别人注意的一种新奇手段。他们的另一个目的也不是在于表示谦虚,而是在于别人被膜之后说的“您那么强,怎么会弱呢”、“我比您菜多了”之类的话给他们带来的成就感。这一点上,就相当于是借对方之口嘲讽对方,给对方带来的困扰远多于直接批评讽刺。拒绝乱膜,从我做起!

原文地址:https://www.cnblogs.com/xzyf/p/8724242.html