P1230

· · 个人记录

P1230

蒟蒻的第二篇题解,真的很想过审

浅谈一下为什么在这么多题解之下依然要写一篇试着看有没有机会过审的原因吧。

试想,我是一个蒟蒻中的蒟蒻,但是老师推荐我做这道题。

我不会结构体,不会结构体排序,不会题解中乱七八糟的数据结构,我该怎么办。

在这样的前提之下,我写了一种方法,专门为了我这样的蒟蒻。

ps.时间复杂度要高出不少,但是,同样有这优点:

所以真心希望可以过审。

思路

(由于专门为了我这样的蒟蒻嘛,所以思路很容易理解,也很详细)

通过阅读题目,我们知道对于一个游戏,只有在规定的时间之前完成才不会扣钱。

而完成一个游戏所需要的花费是一个时间点。

显然,我们想到一种贪心的思路,

从完成时间最后的游戏开始向前枚举,

并将其所耗金额纳入考虑。

通过贪心:

很轻易的可以想到,对于我当下可以玩的游戏来说,我要尽可能得使它所获得的金额更多。

(实际上就是不玩这个游戏扣的钱更少)

然后就可以得出答案。

代码

#include<bits/stdc++.h>
using namespace std;
/*inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}*/
//实际没有什么用的快读(所以注释掉了) 
int m,n,ans,maxx;
int a[10001],b[10001],c[10001];
int main(){
//  m=read(),n=read();
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++){
//      a[i]=read();
        scanf("%d",&a[i]);
        maxx=max(maxx,a[i]);//通过maxx找到我所能玩的最后一个游戏 
    }
    for(int i=1;i<=n;i++){
//      b[i]=read();
        scanf("%d",&b[i]);
        ans+=b[i];
        //把所有扣掉的钱加和,每完成一个游戏,相当于赚到钱,并在ans上减去 
    }
    int cnt=0;
    for(int i=maxx;i>=1;i--){//从后向前开始枚举 
        for(int j=1;j<=n;j++){
            if(i<=a[j]&&b[j]!=0){//如果我的游戏在这个时间依然可以玩 
                c[++cnt]=b[j];//c[i]表示我所有当下可以玩的游戏的金额 
                b[j]=0;
                //为了防止重复计算我当下可以玩的游戏,我们在把游戏的金额考虑之后归零 
            }
        }
        sort(c+1,c+cnt+1);//从小到大排序,显然第cnt个就是最大的,也就是我们当前时间要玩的 
        if(cnt>0){//特判防止没有游戏可以玩而造成错误 
            ans-=c[cnt];
            //玩最贪心的游戏,并在要扣除的钱数里面减去(因为现在玩了游戏,就不需要扣这个游戏的钱) 
            c[cnt]=0;
            cnt--;//游戏已经玩过了,所以删去 
        }
    }
    m-=ans;//最后得到的ans就是我要扣掉的钱的最小值,相减 
    printf("%d",m);
    return 0;
}       

最后,还是真心希望可以过审,虽然没有提供什么特别的思路,也不是特别的方法,但的确是现有36篇题解中没有出现的。

写的很认真

一个蒟蒻敬上。