日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

装备合成

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 装备合成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld

題目描述

輸入描述:

輸入包含t組數據
第一行一個整數t
接下來t行每行兩個整數x,y
輸出描述:
每組數據輸出一行一個整數表示答案。
示例1
輸入
復制

5 4 8 7 6 8 10 100 4555 45465 24124

輸出
復制

2 2 3 50 13917

備注:
1<=t<=10000
1<=x,y<=1e9

題解:

兩個做法一個三分,一個貪心

三分的做法


我們都知道 二分查找 適用于單調函數中逼近求解某點的值。
如果遇到凸性或凹形函數時,可以用三分查找求那個凸點或凹點。
假設A裝備做了m件,B裝備做了n件,我們固定m來求n
n=min( (x-2m)/4 , y-3m )就是看做完m剩下的材料,還能做多少個n,然后返回n+m,不斷三分求出n+m的峰值,即最大值

代碼:

#include<bits/stdc++.h> using namespace std; int x,y; int check(int n){return n+min((x-2*n)/4,y-3*n); } int main(){int T;scanf("%d",&T);while(T--){cin>>x>>y;int l=0;int r=min(x/2,y/3);//目前 的x和y最多能做多少個m while(l<r){int mid1=l+(r-l)/3; int mid2=r-(r-l)/3;if(check(mid1)>check(mid2))r=mid2-1;else l=mid1+1;}printf("%d\n",check(l));}return 0; }

貪心的做法:

1.材料a特別多時,盡量用a來合成裝備2,滿足a>4b,b為多少就可以做多少件
2材料b特別多時,盡量用b來合成裝備1,要滿足3a<2*b,a為多少,就可以做a/2件
3.當兩者差不多時,我們結合題目中兩個式子:2a+3b=1,4a+b=1,我們可以得到a=1/5,b=1/5,也就是合成一件裝備a+b必須是5的倍數,而且觀察式子,a還必須是偶數。
所以如果a不是偶數,或者(a+b)不是5的倍數,結果就要減一
(相當于去除多余的材料,構成a為偶數,a+b為5倍數的情況)

代碼:

#include <bits/stdc++.h> #define ll long long using namespace std; int t; ll a,b; int main() {cin>>t;while(t--) {cin>>a>>b;if(a>(b<<2)) printf("%lld\n",b);else if(a*3<(b<<1)) printf("%lld\n",(a>>1));else {ll sum=(a+b)/5;if(a&1&&(a+b)%5==0) --sum;printf("%lld\n",sum);}} }

總結

以上是生活随笔為你收集整理的装备合成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。