6 solutions
-
2
题目解析:
根据题意可知,本题要求挣的钱最多即所有的项目能完成就完成,是在存在时间冲突的就舍弃惩罚金额最小的项目,使舍弃的所有项目的惩罚金额最小。所以每个项目的惩罚金额就是其价值,我们的目标就是要使价值最大。自然而然的,我们就会想到贪心,其实本题有两种贪心算法,我就分享我使用的,首先用结构体储存项目的时间和价值,根据价值由大到小的排序,优先选择价值最大的项目完成,每个项目的时限是k,可以在1~k时间内完成项目且收获的价值是一样的,优先选择在最后时限k完成项目,以求不浪费时间,如果最后时限k已经被占用就安排在k-1,以此为准则进行安排即一定是最优解。
参考代码:
-
0
分析: 我们要赚最多的钱就要把尽可能将所有游戏都完成,尽量舍弃价值小的。我们用一个结构体来储存时间和价值,然后把游戏价值按从大到小进行排序,创建一个flag对游戏完成与否进行标记 代码: #include #include #include using namespace std; struct set{ int t; int w; bool operator<(const set &rhs)const{ return w>rhs.w; } }; int main() { set a[505]; int m,n,t[505]; memset(t,-1,sizeof(t)); cin>>m; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].t; } for(int i=1;i<=n;i++) { cin>>a[i].w; } sort(a+1,a+1+n); for(int i=1;i<=n;i++) { int flag=0; for(int j=a[i].t;j>=1;j--) { if(t[j]-1) { t[j]=i; flag=1; break; } } if(flag0) { m-=a[i].w; } } cout<<m; }
-
0
这里用了一个对组存了一下每个任务的结束时间以及未完成会扣除的钱,要使扣除的钱最少,就必须得优先完成权重大的任务,我的思路是使用一个布尔数组来表示这一天有没有被使用,比如一个任务截止为4,那我就可以使用4之前的任意一天来完成,但是这里注意,**我完成的时候必须从截止日期的那一天开始找,往回找,比如第4天截止,我就要先判断第4天,再判断第三天,不然后面可能会因为存在比如如果我在第四天完成了截止日期为4的任务,那么紧跟着的截止日期为1的任务就还有完成的机会,如果我截止日期为第四天,我却选择第一天来完成,那么我截止日期为1并且权重仅仅小于截止日期为4的任务就无法完成。**如果这个任务没有找到能用来完成的日期,那我就只能将金额扣除 下面还是贴一下代码:
- 1
Information
- ID
- 94
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 102
- Accepted
- 55
- Uploaded By