装备合成 三分

链接:https://ac.nowcoder.com/acm/contest/5505/E
来源:牛客网

 

 思路:假如我们只用第一种方法来制造装备,那么最多的装备量为:min(n/2,m/3);

    那么,我们想要最大化装备数量,就是减少第一种方法的制造次数,然后用第二种方法去制造

   于是,我们的目的就是找到这个最优的方法。

   在使用x次第一种方法,y次第二种方法时,装备数量最多

   那么在使用小于x次的第一种方法时,从左到右为递增状态,

   在使用大于x次的第一种方法时,从左到右依次递减

   所以这是一个上凸形函数

   我们可以通过三分来解决这道题;

   于是,附上三三分模板,我在处理三分的边界问题的时候;

   整数方面是让其趋于一个区间大小,然后枚举这个区间内的最优值

   小数方面是区域某一精度

   这道题为整数,我们让答案区间为10,然后枚举这个区间即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int check(int x)
 5 {
 6     return x+min((n-2*x)/4,m-3*x);
 7 }
 8 int main()
 9 {
10     int T;
11     scanf("%d",&T);
12     while(T--){
13         scanf("%d%d",&n,&m);
14         int L=0,R=min(n/2,m/3);
15         int ans;
16         while(R>L){
17             int mid1=L+R>>1;
18             int mid2=mid1+R>>1;
19             if(check(mid1)<check(mid2)){
20                 L=mid1;
21                 ans=check(mid2);
22             }
23             else{
24                 R=mid2;
25             }
26         }
27         printf("%d\n",ans);
28     }
29     return 0;
30 }
View Code

 

posted @ 2020-05-04 10:58  古比  阅读(133)  评论(0编辑  收藏  举报