uva714 Copying Books
題意:給你n個數,你只能剛好分成k各部分,並要求某個部分之和最大值最小化。典型二分的題目。但是這題我還是被一個小地方卡了很久。二分下屆l應該取n個數裡最大的數,這個很好想,但是我每次取得都很隨意,直接取得0然後就一直W啊 W啊 W啊。
然後這題注意輸出,根據題意的要求,前面部分最小的選,貪心從後往前求一遍,標記一下分割的位置,再輸出。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[500+10];
int n,k;
bool v[500+10];
bool check(ll x)
{
ll cnt=1 ,sum=0;
for(int i=0;i<n;i++){
if(sum+a[i]>x){
cnt++;
sum=a[i];
}
else sum+=a[i];
}
return k>=cnt;
}
int main()
{
int T;
scanf("%d%*c",&T);
while(T--){
scanf("%d %d",&n,&k);
ll l=0,r=0;
for(int i=0 ;i<n;i++){
scanf("%lld",&a[i]);
r+=a[i];
l=max(l,a[i]);
}
while(l<=r){
int mid=l+(r-l)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
r+=1;
ll sum=0;
int t=1;
memset(v,false ,sizeof(v));
for(int i=n-1;i>=0;i--){
if(sum+a[i]>r){
v[i]=true;
sum=a[i];
t++;
}
else sum+=a[i];
if(k-t==i+1){
for(int j=0;j<=i;j++) v[j]=true;
break;
}
}
for(int i=0;i<n-1;i++){
printf("%lld ",a[i]);
if(v[i]) printf("/ ");
}
printf("%lld\n",a[n-1]);
}
}
相關推薦
uva714 Copying Books
題意:給你n個數,你只能剛好分成k各部分,並要求某個部分之和最大值最小化。典型二分的題目。但是這題我還是被一個小地方卡了很久。二分下屆l應該取n個數裡最大的數,這個很好想,但是我每次取得都很隨意,直接取
[貪心&&二分]uva714 Copying Books
Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so
Uva714 Copying Books 【二分】【例題8-10】
題意:將m個序列分成k個連續的子序列,將各個子序列求和,分的子序列的和的最大值儘量小。 思路: (1)列舉子序列和的最大值,從m個序列中最大值~m個序列的和 之間的數二分列舉最大值,每次列舉的值看能劃分的個數與k值比較,如果<=k 列舉值小縮小,否則增大,直到二分結
UVA714 Copying Books (抄書)
題目連結 題意把一個包含m個正整數的序列劃分成k 個非空的連續子序列,使得每一個正整數都恰好屬於一個序列。設第i個序列的各數之和為S(i),你的任務是讓所有S(i)的最大值儘量小。如果有多種解,S(1)儘量小,如果仍有多種解,S(2)儘量小。以此類推。 分析 二分查詢。 在序列最大
C - Copying Books (POJ - 1505)
blog div 最小值 book 標記 有一個 bool out 輸出 - 題目大意 有m本書,k個人來抄,每本書有一個書本頁數;求使得k個人抄完的最大頁數最小,並且每個人都至少要抄一本,然後輸出抄書的方案 。 - 解題思路 這是個最大值中的最小值問題,
ZOJ——Copying Books 最大值最小化問題 (貪心 + 二分)
題目連結: #include <cstdio> #include <cmath> #include<vector> #include<cstring> #include<algorithm> #include<cmath>
UVA(714) Copying Books
最大值最小化應該是二分法中經典的題目,Copying Books就是一道最大值最小化的題目 題目大致的意思是要抄N本書,編號為1,2,3...N, 每本書有1<=x<=10000000頁, 把這些書分配給K個抄寫員,要求分配給某個抄寫員的那些書的編號必須是連續的。每個抄寫員的速度是相同的,求所有
【ZOJ2002】Copying Books(二分+貪心)
題目連結 Copying Books Time Limit: 2 Seconds Memory Limit: 65536 KB Before the invention of book-printin
UVA 714 Copying Books(二分查詢)(未a)
Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so cal
UVa 714 Copying Books (最大值儘量小_二分+貪心)
原題: Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by
UVa 714 Copying Books(貪心 二分)
題意 把m數分成k組 使每組數的和的最大值最小 如果有多種分法 靠前的組的和儘量小 關鍵是找出那個最小的最大值 可以通過二分來找出 開始左端點為m個數中最大的數 右端點為m個數的和 若中點能將m個數分為小於等於k組 比它大的肯定都是可以的 中點變為右端點
POJ 1505 (Copying Books)(經典二分)
Description Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by h
【二分與三分03】Copying Books
題目來源: 題目大意: 將n本頁數為p1,p2,……,pm(順序排列)的書分給k個抄寫員抄寫,每個抄寫員速度一樣且每個抄寫員只能抄寫編號相鄰的書,求抄寫時間最少的分組。 解題思路: 二分法與貪心。 通過二分法求出一個抄寫員最多需要抄寫的頁數,然後按照這個頁數來分組
UVa:714 Copying Books .
最大值最小化的問題,卡了兩天才做出來。 入門經典上有分析,但是隻提供了求最小的最大值的思路。 具體方法是在某區間上用二分法猜數字,最後猜的一個數x是使得【將輸入數列劃分成m個連續子序列使得所有S(i)均不超過x】成立的最小x,這就是最小的最大值。 這裡二分的並非陣列,
Copying Books(最大值最小化問題)
#include<stdio.h> #include<string.h> long long a[505]; int vis[505]; int ju(long long Ma
Copying Books(貪心 最大值最小化 二分)
題目描述開頭一大堆屁話,我還仔細看了半天。。其實就最後2句管用。意思就是給出n本書然後要分成k份,每份總頁數的最大值要最小。問你分配方案,如果最小值相同情況下有多種分配方案,輸出前面份數小的,就像字典序輸出從小到大一樣的意思。 這裡用到貪心的方法,定義f(x)為真的條件是滿
Copying Books(二分查詢)
在挑戰程式設計競賽上做過類似的,二分答案判斷是否合理。 #include <cstdio> #include <stack> using namespace std; ty
uva 714 Copying Books(二分法求最大值最小化)
題目大意:將一個個數為n的序列分割成m份,要求這m份中的每份中值(該份中的元素和)最大值最小, 輸出切割方式,有多種情況輸出使得越前面越小的情況。 解題思路:二分法求解f(x), f(x) &l
UVa 714 Copying Books 二分 + 貪心 (最大值最小化問題)
/** * 最大值最小化問題: 二分法。 劉汝佳那本白書上也說的很詳細。 * 先把最大值的可能區間計算出來,也就是[0, maxAns] maxAns 就是所有頁數總和。 * 然後再在答案區間裡先把“最大值最小化”。 * 得到最小化後的最大值以後,就可
Copying Books +uva+二分+貪心
Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so c