3.25 每日一题题解

tokitsukaze and Soldier

涉及知识点:

  • 优先队列/贪心

solution:

  • 每个士兵都有战力Vi和一个限制Si,我们先按照每个士兵的Si从大到小进行排序
  • 然后我们根据排好序的士兵遍历
  • 因为士兵的Si从大到小,所以遍历的过程中,当前遍历的士兵对应的si一定是最小
  • 所以我们可以维护一个大小由Si较小的优先队列
  • 如果队列大小小于当前遍历士兵的Si,就扔到优先队列里,一旦士兵的人数超过限制,出队,直到队列大小等于当前士兵的Si减一
  • 奉上大佬精讲的题解:牛客每日一题3月25日精讲

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
struct node{
    ll v;
    int s;
};
node a[maxn];
bool cmp(node p1,node p2){
    return p1.s > p2.s;
}
priority_queue< ll ,vector<ll>,greater<ll> > q;//小根堆
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld %d",&a[i].v,&a[i].s);
    }
    sort(a+1,a+1+n,cmp);
    ll ans = 0 , cnt = 0;
    for(int i=1;i<=n;i++){
        while(q.size() >= a[i].s){
            cnt -= q.top();
            q.pop();
        }
        q.push(a[i].v);
        cnt += a[i].v;
        ans = max(ans , cnt);
    }
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12565479.html

时间: 2024-08-30 11:11:39

3.25 每日一题题解的相关文章

3.21 每日一题题解

小K的疑惑 题目链接:https://ac.nowcoder.com/acm/problem/20823 涉及知识点: 思维/搜索/简单图论 solution: 题目要求??????(??,??) = ??????(??,??) = ??????(??,??) ,首先要满足每两个节点的距离都是偶数,即??????(??,??) = ??????(??,??) = ??????(??,??) = 0 由于树上任意两点的距离是唯一的,所以如果i到j的距离是奇数,j到k的距离是奇数,那么i到k的距离一

3.22 每日一题题解

Farewell Party 题目链接:https://codeforces.com/problemset/problem/1081/B 涉及知识点: 思维/构造 solution: 考虑颜色不同的人数不是很好想,下面我们考虑帽子颜色相同的人数 样例2的3 3 2 2 2,反过来就是2 2 3 3 3 这样是不是就能看出来如何判断了,把颜色相同的人加到一起,如果加起来人的个数 = 对应颜色相同的人数,就对了 当然不是! 如果输入 2 2 2 2 ,我们会输出Impossible,其实我们忽略了一

3.31 每日一题题解

Arpa's obvious problem and Mehrdad's terrible solution 题目链接:http://codeforces.com/problemset/problem/742/B 涉及知识点: 数学 solution: 题意就是让你找出给定数列里两两异或值为x的组合个数 暴力n方,会超时 根据异或运算性质:a^b=x; x^a=b; x^b=a; 所以可以直接O(n)的遍历每一个数,查找x异或这个数是否存在即可 std: #include <bits/stdc+

4.6 每日一题题解

三角形 题目链接:https://ac.nowcoder.com/acm/contest/4911/B 涉及知识点: 背包dp solution: 背包是dp算法中非常经典的一个问题(如果打算学dp的同学必须要学会背包问题),具体的大家可以看我发在群里的背包九讲pdf 关于这道题目,我们可以对每一个宝箱做一个背包 题目要求从每一个宝箱中有且只能取一个,所以设dp[i][j]为枚举到第i个宝箱,可以获得钱数等于j的方案数 那么转移方程就等于 dp[ i ][ z ] += dp[ i-1 ][ z

4.11 每日一题题解

完全平方数 题目链接:https://ac.nowcoder.com/acm/contest/37/A 涉及知识点: 暴力/二分 solution: \(祝大家周末愉快\) \([1,n]区间的完全平方数的个数等于\) \(\sqrt{n}\) \([L,R]区间的完全平方数的个数可以理解为\) $\sqrt{R} - \sqrt{L-1} $ \(0也是完全平方数,L和R是否为0判断一下即可\) \(当然将所有平方数放入数组,lowerbound二分也是时间复杂度允许的可行解\) std: #

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.

C语言每日一题之No.1

鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C这东西毕竟是练出来的,所以从今天开始,每日一道C语言题目,从题目入手来补知识漏洞.题目比较基础,如不堪入目,还请见谅. 题目:输入三个整数,输出最大的数 思路:定义三个变量用来存储输入的整数 比较三个变量的大小,找到最大的数 定义一个变量存储来存储最大的数 程序: 1 #include <stdio

老男孩教育每日一题-第101天-如何通过端口查找出进程所在目录?

参考答案: 第一步-找到端口对应的进程的号 [[email protected] ~]# ss -lntup |grep :22 tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",1467,4)) tcp    LISTEN     0      128                    *:22                    *:*