二分查找-CodeForces 812C-Sagheer and Nubian Market

ゞ 浴缸里的玫瑰 2022-05-16 05:18 245阅读 0赞
  • 二分查找-CodeForces 812C-Sagheer and Nubian Market


  • 题目链接:C. Sagheer and Nubian Market

  • 思路:

题目大意是有n件纪念品,一共有S元,如果买k件,那第i件纪念品的时间价格truePrice=Price+k*i ,问在S内,最多能买多少件纪念品,如果有多种情况,选总花费最少的。

数据:n and S (1 ≤ n ≤ 10^5 and 1 ≤ S ≤ 10^9) 不出意外暴力会超时,用二分做,合法的化区间就往右走

然后要考虑总花费最小,定义一个优先队列,自定义greater(队头为最小价格),这样指定购买数目内可得最小总价

  • 代码:

    include

    include

    include

    include

    include

    using namespace std;

    define MAX_SIZE 100005

    long long n,S,Consum,MinPrice=0,Max_num=0;
    long long a[MAX_SIZE];

    bool Judge(long long Mid)
    {

    1. Consum=0;
    2. priority_queue<long long,vector<long long>,greater<long long> > Price_List;
    3. for(long long i=1;i<=n;i++)
    4. Price_List.push(a[i]+Mid*i);
    5. for(long long i=0;i<Mid;i++)
    6. {
    7. Consum+=Price_List.top();
    8. Price_List.pop();
    9. }
    10. return Consum<=S; //总花费不大于S

    }

    int main()
    {

    1. cin>>n>>S;
    2. for(long long i=1;i<=n;i++)
    3. scanf("%lld",&a[i]);
    4. long long Left=1,Right=n,Mid;
    5. while(Left<=Right)
    6. {
    7. Mid=(Left+Right)/2;
    8. if(Judge(Mid)) //合法时记录下最大购买及最小总价
    9. {
    10. Left=Mid+1;
    11. MinPrice=Consum;
    12. Max_num=Mid;
    13. }
    14. else
    15. Right=Mid-1;
    16. }
    17. cout<<Max_num<<" "<<MinPrice<<endl;
    18. return 0;

    }

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 查找——二分查找

    基本思想 二分查找是建立在有序顺序表基础上的!步骤如下: 1.      将表中间位置记录的关键字与给定K值进行比较,若两者相等,则查找成功。 2.