注册 登录
编程论坛 C++教室

贪婪技术

msshadow 发布于 2007-12-04 15:12, 1148 次点击
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S 的一个时间表用于描述S 中单位时间任务的执行次序。时间表中第1 个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。
(1) n 个单位时间任务的集合S={1,2,…,n};
(2) 任务i的截止时间di ,1≤i≤n,1≤ di ≤n,即要求任务i 在时间di 之前结束;
(3) 任务i 的误时惩罚wi ,1≤i≤n,即任务i 未在时间di 之前结束将招致wi 的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S 的一个时间表(最优时间表)使得总误时惩罚达到最小。
给定n 个单位时间任务,各任务的截止时间di ,各任务的误时惩罚wi ,1≤i≤n,编程计算最优时间表。

[bold]Input [/bold]第一行是正整数n,表示任务数。接下来的2行中,每
行有n个正整数,分别表示各任务的截止时间和误时惩罚。

[bold]Output [/bold]最小总误时惩罚

[bold]Sample Input [/bold]

7
4 2 4 3 1 4 6
70 60 50 40 30 20 10


[bold]Sample Output [/bold]

50

5 回复
#2
leeco2007-12-04 20:34
贪心+DP,不知道有没有更好的算法
程序代码:
#include <iostream>
using namespace std;

/*
f[i][j]=min{ f[i+1][j]+b[i], if(j<a[i])f[i+1][j+1] };
f[n][*]=0;
*/

int _f[2][1000000];

struct {
    int* operator [] (int i){
        return _f[i&1];
    }   
}f;   

struct Node {
    int a;
    int b;
}arr[1000000];

bool operator < (const Node& a,const Node& b){
    return a.a<b.a;
}   

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d",&arr[i].a);
        }   
        for(int i=0;i<n;i++){
            scanf("%d",&arr[i].b);
        }   
        sort(arr,arr+n);
        for(int j=0;j<=n+1;j++){
            f[n][j]=0;
        }   
        for(int i=n-1;i>=0;i--){
            for(int j=n;j>=0;j--){
                f[i][j]=f[i+1][j]+arr[i].b;
                if(j<arr[i].a)f[i][j]<?=f[i+1][j+1];
            }
        }
        printf("%d\n",f[0][0]);
    }   
}   
#3
msshadow2007-12-12 12:14
回复 2# 的帖子
首先,感谢leeco的帮助,但是我的的编译器确通不过啊,你用的是什么编译器呢?
#include<iostream.h>
#include <stdlib.h>
int m;
int a[100]={0},b[100]={0};
int f[10000][10000];
int Compare(const void *elem1, const void *elem2)
{
    return *((int *)(elem1)) - *((int *)(elem2));
}

int main()
{
    int i,j;
    int sum=0;
    cin>>m;
    for(i=0;i<m;i++)
        cin>>a[i];
    for(i=0;i<m;i++)
        cin>>b[i];
    qsort(b, m, sizeof(int), Compare);
    for(j=0;j<=m+1;j++)
    {
        f[m][j]=0;
    }  
    for( i=m-1;i>=0;i--)
    {
        for( j=m;j>=0;j--)
        {
            f[i][j]=f[i+1][j]+b[i];
            if(j<a[i])
            {
                if(f[i][j]<f[i+1][j+1])
                    f[i][j]=f[i+1][j+1];
            }
        }
    }
    cout<<f[0][0];    
    return 0;
}
看看我改的程序呢?
#4
leeco2007-12-12 16:48
回复 3# 的帖子
我用的G++
#5
Jason-xl2007-12-12 18:20
二楼的好像是C语言~
#6
msshadow2007-12-16 22:26
回复 4# 的帖子
知道了,我在devC++里通过了...谢谢了..
1