信息学奥赛一本通 1242:网线主管 | OpenJudge NOI 1.11 04:网线主管
【題目鏈接】
ybt 1242:網線主管
OpenJudge NOI 1.11 04:網線主管
【題目考點】
1. 二分答案
【解題思路】
看題目中的數據都帶小數點,似乎這是實數域上的問題。但仔細分析,該題的輸入數據精確到厘米,要求輸出結果精確到厘米,實際只要在處理過程中保持為以厘米為單位,那么該問題本質上是整數域的問題。
用二分思想考慮該問題,題目問:要找最長的網線長度。對應的模板為:求滿足某一條件的最大值。
網線長度需要滿足的條件為:將庫存中的網線按該長度進行切割,得到的網線數量大于等于居民需要的網線數量。
假設要判斷為網線長度為x是否滿足條件,先遍歷所有庫存中網線長度,每條網線長度記為l,那么l/x(整除運算)即為這條庫存網線可以切出的成品網線的條數,加和求出總條數??刺幚淼玫降木W線總條數是否大于等于居民需要的網線數量k,如果是,那么滿足條件,否則不滿足條件。
注意單位換算,計算過程用厘米為單位,輸出時轉用單位米。
二分查找時,網線長度最小值設為0,最大值為100km=107cm100km=10^7cm100km=107cm,考慮極端情況,假設庫存中每條網線都是107cm10^7cm107cm,一共有10410^4104條,而要切成1cm1cm1cm的網線,共有107?104=101110^7*10^4=10^{11}107?104=1011條網線,超出了int的范圍。所以網線計數變量要設為long long。
【題解代碼】
解法1:二分答案
#include <bits/stdc++.h> using namespace std; int n, k, a[10005];//a[i]:第i條網線的長度 單位:厘米 bool check(int l)//如果需要網線長度為l,最多可以得的網線段數是否大于等于k {long long ct = 0;//計數for(int i = 1; i <= n; ++i)ct += a[i] / l;//整除運算return ct >= k; } int main() {double t; cin >> n >> k;for(int i = 1; i <= n; ++i){cin >> t;a[i] = t * 100;//單位:厘米}if(check(1) == false)//如果切成1厘米一段也不能達到要求的數量,則沒有切割方案 {cout << "0.00";return 0;} int l = 1, r = 1e7, m;while(l < r)//二分答案求滿足條件的最大值{m = (l + r + 1) / 2;if(check(m))//如果網線長為m滿足條件l = m;elser = m - 1;}cout << fixed << setprecision(2) << (double)l / 100;//單位轉為米return 0; } 新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的信息学奥赛一本通 1242:网线主管 | OpenJudge NOI 1.11 04:网线主管的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 区管理系统,oracle区
- 下一篇: OpenJudge NOI 1.7 14