Codeforces Round #501 (Div. 3) C Songs Compression

翻译

给你 n 首歌,每首歌压缩前大小为 a i ,压缩后大小为 b i ,你现在的空间大小为 m ,问你至少需要压缩几首歌才能使得你装下所有的歌?

思路

B 题题解说了只有20分钟了,然而我的目标是 A A 题到 D 题。。

一看是一道贪心,思路就是把压缩后与压缩前的从大到小排序后减去正常情况下要的空间,看看什么时候能够空间或者答案是 1

然鹅就这么简单吗?不的,看看下面的几个坑点:

  • 请开long long,会爆int的,这点我注意到了

  • 请注意压缩前的大小可能比压缩后的大小还要小!( P S : 我就因为这个点死在第七个点上,原因是这是个英文题,我只是个准八年级学生,直接谷歌翻译,能理解就不错了 Q A Q ,看来这是传说中的反常压缩?不过我还算聪明,最后在 11 : 55 放弃了这道题,并且去干 D 题,不过刚刚看完题目就十二点整了,没办法只好第二天下午补上 D 题了 Q A Q ,啊啰嗦这么多了)

  • 排完顺序后一定要先判断内存够不够,再减去!(我一开始错在这, d e b u g 了几分钟)。

有点靠基本功的感觉啊,坑多死了 w w w

Code

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
long long n,m,c[1000001],ans,sum;//long long许多人爆了,我~~比较细心~~,没有炸233
bool comp(int a,int b)
{
    return a>b;
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int a,b;
        cin>>a>>b;
        c[i]=abs(a-b);//注意,压缩后大小可能差为负数,这就是我这题一直死在第七个点的原因
        sum+=a;
    }
    sort(c+1,c+n+1,comp);//排序
    for(int i=1; i<=n; i++)
    {
        if(sum<=m)//有点坑,但是~~细心的我~~还是注意到了
            break;
        else
            ans++,sum-=c[i];//减去
    }

    if(sum>m)
        cout<<-1<<endl;
    else
        cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/81329399