sgu-259 Printed PR

題目大意:

N(N<=100) 個產品,每個產品有兩個屬性Ti,Li ,表示做這個產品的所需時間和遞送時間,遞送必須在產品完成後開始,在遞送時可以進行下一個產品的製作。同一時間內只能有一個產品在製作,但是可以有多個產品遞送,問遞送完所有的產品的時間。

解題思路:

經典貪心題目,白書上好像有原題吧。
思路就是將所有的產品按遞送時間從大到小排序,然後直接從前往後做就行了。
證明:
首先,顯然完成所有產品的時間是確定的。然後我們考慮交換兩個產品的製作順序。
1. 如果Li>Li+1 ,那麼總時間就是Ti+Ti+1+max{Li+1,LiTi+1} ,如果交換之後就是Ti+Ti+1+max{Li,Li+1Ti} ,由於Li>Li+1 所以max{Li+1,LiTi+1}<=Li<=max{Li,Li+1Ti} ,顯然時間要變長。

AC代碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int N;
struct task_
{
    int T,L;
}task[110]={{0,0}};

bool cmp(struct task_ a1,struct task_ a2)
{return a1.L>a2.L;}

int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
        scanf("%d",&task[i].T);
    for(int i=1;i<=N;i++)
        scanf("%d",&task[i].L);
    sort(task+1,task+N+1,cmp);
    int st=0;
    int ans=0;
    for(int i=1;i<=N;i++)
    {
        st+=task[i].T;
        ans=max(ans,st+task[i].L);
    }
    cout<<ans<<endl;
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章