BZOJ 3874: [Ahoi2014]宅男计划
Description
Input
Output
输出仅包含一行一个整数表示JYY可以宅的最多的天数。
Sample Input
32 5 2
5 0
10 2
Sample Output
HINT
【样例说明】
题解
我们这么想,如果我们购买次数少了,那么就可能导致要被迫购买一些保质期比较长但是贵的东西,是不划算的;如果我们购买次数多了,那么我们花费在小哥身上的钱就过多了,那么给自己买吃的总金额会较少,也是不划算的、、所以、、我们猜想!【我还记得当时有人临场证明,然后其他题目没写完、、、但是他证出来了,作为蒟蒻的我没证出来,也没有他考的高、、】把购买次数作为自变量,生存天数作为因变量,这是一个凸函数,所以我们可以用三分法寻找极值点。【那么我悄悄的告诉你,其实枚举购买次数,可以60分、】然后我们看得到了购买次数,如何快速计算生存天数,其实是可以贪心的,我们先预处理把那些效果相同但是价格更贵的食物去掉,然后按照保质期排序贪心!然后配合刚才的三分法就能A掉了!【我擦、、我Wa了一次80因为我把三分法写成了四分法=W=果然,数学是硬伤、、、、还有一句话,数据留邮!】
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
/* Author:WNJXYK WebSite:http://wnjxyk.cn Weibo:http://weibo.com/WNJXYK */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int Maxn=205; struct Food{ long long s,p; Food(){} Food(long s0,long long p0){ s=s0;p=p0; } }; inline bool cmpFood(Food a,Food b){ if (a.s>b.s) return true; if (a.s==b.s && a.p<b.p) return true; return false; } inline bool cmpFoodInMoney(Food a,Food b){ if (a.s<b.s) return true; return false; } inline long long remax(long long a,long long b){ if (a>b) return a; return b; } inline long long remin(long long a,long long b){ if (a<b) return a; return b; } long long M,F; long long minPrice; int n; Food food[Maxn]; inline void init(){ int tmpN=n; int nowPoint=1; minPrice=food[1].p; sort(food+1,food+n+1,cmpFood); for (int i=2;i<=n;i++){ minPrice=remin(minPrice,food[i].p); if (food[i].s<=food[nowPoint].s && food[i].p>food[nowPoint].p){ --tmpN; food[i].s=-1; }else nowPoint=i; } sort(food+1,food+n+1,cmpFood); n=tmpN; sort(food+1,food+n+1,cmpFoodInMoney); } long long Ans; long long left,right,lmid,rmid; long long lmidAns,rmidAns; inline long long calc(long long ts); inline void solve(){ left=1;right=M/(F+minPrice); Ans=remax(calc(left),calc(right)); while(left+25<right){ lmid=left+(right-left)/(long long)3; rmid=left+(right-left)*(long long)2/(long long)3; lmidAns=calc(lmid); rmidAns=calc(rmid); if (lmidAns>rmidAns){ Ans=remax(Ans,lmidAns); right=rmid; }else{ Ans=remax(Ans,rmidAns); left=lmid; } } for (long long k=left;k<=right;k++){ Ans=remax(Ans,calc(k)); } printf("%lldn",Ans); } inline long long calc(long long ts){ long long m=M-(long long)F*(long long)ts; if (m<0) return 0; long long ans=0,days=0; for (int i=1;i<=n;i++){ if (days<=food[i].s){ long long ld=food[i].s-days+1; long long dd=remin(ld,m/(long long)food[i].p/(long long)ts); ans+=dd*ts; m-=(long long)food[i].p*(long long)ts*(long long)dd; days+=dd; } if (days<=food[i].s){ long long v=remin(ts,m/(long long)food[i].p); ans+=v; m-=food[i].p*v; days++; } } return ans; } int main(){ //freopen("food.in","r",stdin); //freopen("food.out","w",stdout); scanf("%lld%lld%d",&M,&F,&n); for (int i=1;i<=n;i++) scanf("%lld%lld",&food[i].p,&food[i].s); init(); solve(); return 0; } |

原文链接:BZOJ 3874: [Ahoi2014]宅男计划
WNJXYKの博客 版权所有,转载请注明出处。
太神了orzzzzz
太神了orzzzzz
太神了orzzzzz