1. 程式人生 > >洛谷P1800 software_NOI導刊2010提高(06)

洛谷P1800 software_NOI導刊2010提高(06)

協同 range right ace pac 所有 cst 同時 一個人

P1800 software_NOI導刊2010提高(06)

題目描述

一個軟件開發公司同時要開發兩個軟件,並且要同時交付給用戶,現在公司為了盡快完成這一任務,將每個軟件劃分成m個模塊,由公司裏的技術人員分工完成,每個技術人員完成同一軟件的不同模塊的所用的天數是相同的,並且是已知的,但完成不同軟件的一個模塊的時間是不同的,每個技術人員在同一時刻只能做一個模塊,一個模塊只能由一個人獨立完成而不能由多人協同完成。一個技術人員在整個開發期內完成一個模塊以後可以接著做任一軟件的任一模塊。寫一個程序,求出公司最早能在什麽時候交付軟件。

輸入輸出格式

輸入格式:

輸入文件第一行包含兩個由空格隔開的整數n和m,其中1<=n<=100,1<=m<=100,接下來的n行每行包含兩個用空格隔開的整數d1和d2,d1表示該技術人員完成第一個軟件中的一個模塊所需的天數,d2表示該技術人員完成第二個軟件中的一個模塊所需的天數,其中1<= d1,d2<=100。

輸出格式:

輸出文件僅有一行包含一個整數d,表示公司最早能於d天後交付軟件。

輸入輸出樣例

輸入樣例#1: 復制
3 20
1 1
2 4
1 6
輸出樣例#1: 復制
18

說明

【樣例】

最快的方案是第一個技術人員完成第二個軟件的18個模塊,用時18天,第三個技術人員完成第一個軟件的18個模塊,用時18天,其余的模塊由第二個技術人員完成,用時12天,做完所有模塊需要18天。如果第一個技術人員完成第二個軟件的17個模塊,第三個技術人員完成第一個軟件的17個模塊,其余的模塊由第二個技術人員完成,需要用時18天,做完所有模塊仍然需要18天,所以少於18天不可能做完所有模塊。

/*
    f[i][j]第i個人完成1模塊的j塊,大家還可以完成2模塊的最多模塊數
*/
#include<iostream>
#include<cstdio>
using namespace std;
int f[101][101],d[101][2],l,r,mid,n,m,t;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&d[i][0],&d[i][1]);
    r=10000;
    
while(l<=r){ mid=(l+r)>>1; for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) f[i][j]=-9999999; f[0][0]=0; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=min(j,mid/d[i][0]);k++) f[i][j]=max(f[i][j],f[i-1][j-k]+(mid-d[i][0]*k)/d[i][1]); if(f[n][m]>=m)r=mid-1; else l=mid+1; } printf("%d",l); }

洛谷P1800 software_NOI導刊2010提高(06)