列表

详情


NC50537. 任务安排 1

描述

有N个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这N个任务分成若干批,每一批包含连续的若干个任务。从时刻0开始,任务被分批加工,执行第i个任务所需的时间是T_i。另外,在每批任务开始前,机器需要S的启动时间,故执行一批任务所需的时间是启动时间S加上每个任务所需时间之和。
一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数C_i
请为机器规划一个分组方案,使得总费用最小。

输入描述

第一行是N。第二行是S。
下面N行每行有一对正整数,分别为T_iC_i,表示第i个任务单独完成所需的时间是T_i及其费用系数C_i

输出描述

一个数,最小的总费用。

示例1

输入:

5
1
1 3
3 2
4 3
2 3
1 4

输出:

153

说明:

分组方案为{1,2 }, {3 }, {4,5 },则完成时间为{5,5,10,14,14 },费用C= {15,10,30,42,56 },总费用为153。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 6ms, 内存消耗: 344K, 提交时间: 2022-03-20 16:47:00

#include<stdio.h>
int min(int x,int y){
	int z;
	return z=x<=y?x:y;
}
int main(){
 int sumt[100010],sumc[100010],co[100010];
 int N,S;
 scanf("%d%d",&N,&S);
 sumt[0]=0;
 co[0]=0;
 sumc[0]=0;
 for(int i=1;i<=N;++i){
 	scanf("%d%d",&sumt[i],&sumc[i]);
     sumc[i]+=sumc[i-1];
 	sumt[i]+=sumt[i-1];
 }
  /*for(int i=1;i<=N;++i){
  printf("%d %d ",sumc[i],sumt[i]);
 }*/
    for(int i=1;i<=N;++i)co[i]=1000000000;
 for(int i=1;i<=N;++i){
 	 	for(int j=0;j<i;++j)
 	co[i]=min(co[i],co[j]+sumt[i]*(sumc[i]-sumc[j])+S*(sumc[N]-sumc[j]));

 }
 printf("%d",co[N]);
}

C++(g++ 7.5.0) 解法, 执行用时: 7ms, 内存消耗: 648K, 提交时间: 2023-02-16 17:54:55

#include<iostream>
#include<cstdio>
#include<cstring>
//#include<algorithm>
const int N=50001;
using namespace std;
int main()
{
    int n,s;
    int st[N],sc[N];
    int f[N];
    cin>>n>>s;
    for(int i=1;i<=n;i++)
    {
        cin>>st[i]>>sc[i];
        st[i] +=st[i-1];
        sc[i] +=sc[i-1];
        
    }
    memset(f,0x3f,sizeof(f));
    f[0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<i;++j){
            f[i]=min(f[i],f[j] + (sc[i]-sc[j])*st[i] + s*(sc[n]-sc[j]));
        }
    }
    cout<<f[n];
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 416K, 提交时间: 2020-10-19 19:38:57

#include<bits/stdc++.h>
using namespace std;
const int nn=5019;
int n,s,t[nn],c[nn],f[nn];
int main(){
	memset(f,0x3f,sizeof f);
	f[0]=0,scanf("%d%d",&n,&s);
	for(int i=1;i<=n;i++)
		scanf("%d%d",t+i,c+i),
		t[i]+=t[i-1],c[i]+=c[i-1];
	for(int i=1;i<=n;i++)
		for(int j=0;j<i;j++)
			f[i]=min(f[i],f[j]+t[i]*(c[i]-c[j])+s*(c[n]-c[j]));
	return printf("%d",f[n]),0;
}

上一题