博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷1230
阅读量:4577 次
发布时间:2019-06-08

本文共 960 字,大约阅读时间需要 3 分钟。

这个题就是一个贪心问题,具体分析:

要使罚款最少,我们显然应尽量完成c[i]值较大的工作。 此时,我们可以将工作按c[i]从大到小进行排序,然后按照排好的顺序依次对工作进行安排,安排的规则为:使处理工作i的时间既在t[i]之内,又尽量靠后;如果t[i]之内的时间都已经排满,就放弃处理此项工作。

证明:

假设按照上述方法得到的解不是最优的,那么必然存在某个工作j应当安排到处理的过程中,却没有得到安排。假设我们要将该工作安排进去,由于时间t[j]内都已经排满,就必然需要将一个已安排的工作k与之替换,而c[k]>=c[j],这样替换显然会增加罚款的数额。因此,除上述安排方法以外的安排方法都不会使罚款的数额减少,可得上述方法得到的结果是最优的。

 

思想就是类似于克鲁斯凯尔的最短路问题,证明也是这样.

 

具体代码:

#include<algorithm>

#include<cstdio>
using namespace std;
struct WORK{
  int cost,time;
}work[501];
int n,m;
bool t[501];
bool COMP(WORK a,WORK b){return a.cost>b.cost;}
int main(){
  scanf("%d %d",&m,&n);
  for(int i=1;i<=n;i++)
    scanf("%d",&work[i].time);
  for(int i=1;i<=n;i++)
    scanf("%d",&work[i].cost);
  sort(work+1,work+n+1,COMP);
  for(int i=1;i<=n;i++){
    m-=work[i].cost;
    for(int j=work[i].time;j>=1;j--)
      if(t[j]==0){
        t[j]=1;
        m+=work[i].cost;
        j=0;
      }
  }
  printf("%d",m);
  return 0;
}

转载于:https://www.cnblogs.com/my-inspirations/p/7280902.html

你可能感兴趣的文章
二分图
查看>>
UVA10559&POJ1390 Blocks 区间DP
查看>>
《Linux内核》读书笔记 第十八章
查看>>
【AS3代码】擦窗户效果(也就是流行的妄撮游戏)
查看>>
[bzoj 3289] Mato的文件管理
查看>>
Flutter学习笔记(五)
查看>>
Linux zip命令详解
查看>>
vSphere的exsi root密码忘记了
查看>>
svn的安装过程
查看>>
pure的bug记录2
查看>>
NSCopying简析
查看>>
python抓取51CTO博客的推荐博客的全部博文,对标题分词存入mongodb中
查看>>
oracle 用户 角色 权限
查看>>
P2083 找人
查看>>
MySQL 分区知识点(三)
查看>>
使用pipreqs生成项目依赖
查看>>
android 二维码生成
查看>>
sql server2008 R2安装总结
查看>>
linux命令行快捷键
查看>>
怎么拿到url地址?后的某个参数值
查看>>