C++ 洛谷P1230 智力大冲浪

此题是贪心算法

把此题当成允许座位(空间)问题

首先分析样例——

10000

7

4 2 4 3 1 4 6

70 60 50 40 30 20 10

原先有10000(m)元,有7(n)项活动。

可以在1-4内完成zl[1].t,否则扣钱70元zl[1].v;有4个座位

可以在1-2内完成zl[2].t,否则扣钱60元zl[2].v;有2个座位

可以在1-4内完成zl[3].t,否则扣钱50元zl[3].v;有4个座位

可以在1-3内完成zl[1].t,否则扣钱70元zl[1].v;有3个座位

可以在1-1内完成zl[2].t,否则扣钱60元zl[2].v;有1个座位

可以在1-4内完成zl[3].t,否则扣钱50元zl[3].v;有4个座位

可以在1-6内完成zl[3].t,否则扣钱50元zl[3].v;有6个座位

要想得到更多钱,就要少扣钱,等于把扣钱多的游戏玩了在玩扣钱少的。

所以贪心策略如下:

从多到少——————

如果规定时间允许就贪。

先把第1个最贵的做了,把第四个座位占了。(肯定越后面的越好啊,就不会影响前面的座位,只影响后面的座位。)所以凡是能占第四个座位的,都会少一个的座位。座位数就变成了

(第1个游戏玩了,2 4-1 3 1 4-1 6-1——2,3,3,1,3,5);

以此类推……(如果时间<0,就在扣钱总数中加上相应扣钱数)

he+=zl[i].v;

本人为了学习信息学奥赛,因为时间关系就不陈述了。

说不清了,粘代码!!!

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,he,we;
struct c{      //结构体
    int t,v;
}zl[501];
bool cmp(c a,c b)  //sort函数按金钱大小来排(money!!!)
{
    return a.v>b.v;
}
int main()
{
    scanf("%d%d",&m,&n);
    for (int i=1;i<=n;i++)
    scanf("%d",&zl[i].t);  //规定时间
    for (int i=1;i<=n;i++)
    {
            scanf("%d",&zl[i].v); //扣钱!!
    }
    sort(zl+1,zl+n+1,cmp);
    for (int i=1;i<=n;i++)
    {
        if(zl[i].t>0)    //如果有时间完成,就完成。
        {
            for(int j=i+1;j<=n;j++)  //完成后,所有能站此座位的的,都少了一座位,就-1。(多理解一下)。
            if(zl[i].t<=zl[j].t) 
            zl[j].t--;
        }
        else     //没时间,就代表必须扣相应的钱了。
        he+=zl[i].v;
    }
    printf("%d",m-he);
    return 0;
 }

勿喷!!!!!!!!!!!qaq,,

猜你喜欢

转载自www.cnblogs.com/mzyczly/p/10702418.html