C++,codeforces,706B,B. Interesting drink

//B. Interesting drink
/*
题目大意是
有n个商店出售产品A, 第i个商店的售价是x[i]
需要连续q天购买一个产品A, 第i天的可用的钱数是m[i]
这q天每天能够买得起的商店数量(x[]<m[i])
输入:
n(商店总数)
1 2 3... (n个数据,各个商店的售价)
q(天数)
1 2 3... (n个数据,每天的预算)
*/

/*
刚开始简单粗暴的想法(超时了):
用std::multiset储存商店的售价
每获取一天的预算, 用std::upper_bound()找到第一个大于预算的售价
用std::distance()获得在该售价之前有几个售价(这些售价小于等于预算)
然后输出

最终解决方案:
将商店售价从小到大排序,将预算也从小到大排序
用vector储存售价, 下标就能反映低于该售价的商店数
用vector储存预算, 用std::sort()排序
从低到高遍历预算, 找到第一个大于预算的售价, 根据预算下标确定商店数
每次变量后预算下标不重置, 保持上次的位置, 从上次位置开始遍历
因为后面的预算更大,比它们大的商店售价一定在该下标后面
这样预算只用遍历一次,预算也只用遍历一次
*/
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <set>
bool compare(std::pair<int,int> l,std::pair<int,int> r){
    return l.first<r.first;
}
int main(){
    int n;std::cin>>n;
    std::vector<int> prices(n);
    for(int i = 0;i<n;++i)std::cin>>prices[i];
    std::sort(prices.begin(),prices.end());
    int q;std::cin>>q;
    std::vector<int> anss(q);
    std::vector<std::pair<int,int>> moneys(q);
    // std::multiset<std::pair<int,int>,compare> moneys;
    for(int i = 0;i<q;++i){
        std::pair<int,int> a;
        std::cin>>a.first;a.second = i;
        moneys.push_back(a);
    }
    std::sort(moneys.begin(),moneys.end(),compare);
    int index = 0;
    for(auto money : moneys){
        while(index<n && prices[index]<=money.first){
            ++index;
        }
        anss[money.second] = index;
    }
    for(int i = 0;i<q;++i){
        std::cout<<anss[i]<<std::endl;      
    }
}
posted @ 2025-02-03 21:47  Kazuma_124  阅读(6)  评论(0编辑  收藏  举报