首页 > 其他分享 >AtCoder-ABC-309 C - Medicine

AtCoder-ABC-309 C - Medicine

时间:2023-08-16 18:24:27浏览次数:46  
标签:AtCoder ABC const int sum 数组 Medicine 种药

C - Medicine

题目大意:

给 n 种药,第 i 种药吃 \(a_i\) 天,每天 \(b_i\) 粒。问最早在第几天,当天要吃的药 ≤ K 。
\(1<=n<=3*10^5\)
\(0<=k<=10^9\)
\(1<=a_i,b_i<=10^9\)

解题思路

首先了解了 n 种药,每次都是从第一天开始,持续 \(a_i\) 天,所以我当时直接想到用差分来做,数组初始全为 0 ,每次对 sum[1] + \(b_i\) ,对 sum[\(a_i+1\)] - \(b_i\) ,在最后要做前缀和的时候,发现虽然 n 的范围很小,但是 \(a_i\) 的跨度(\(10^9\))很大,不能遍历 sum 数组进行判断。

正确做法:使用 pair< int , int > 数组,储存 <\(a_i\),\(b_i\)>。数组大小为 n ,排个序。按照每种药的持续时间从小到大排列。然后遍历一次,求出第一天总共要吃多少粒药。之后遍历 pair 数组,减去当前种药的粒数,如果 ≤ K ,那么就说明在这种药的持续时间结束后,就永远的 ≤ K 了,答案就是p[i].second+1。还可能要全部吃完 = 0 才满足。

AC

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define IOS ios::sync_with_stdio(false),cin.tie(0);
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int MOD = 998244353;
const int N = 1e5 + 5;

//kmp kruskal lca 线段树 线性筛 组合数 线性同余方程
int n, k;

void solve () {
    cin >> n >> k;
    pair<int, int>p[n];
    for (int i = 0; i < n; ++i) {
        cin >> p[i].first >> p[i].second;
    }
    sort(p, p + n);
    ll sum = 0;
    for (int i = 0; i < n; i++)sum += p[i].second;
    if (sum <= k)cout << 1 << endl;
    else {
        for (int i = 0; i < n; i++) {
            sum -= p[i].second;
            if (sum <= k) {
                cout << p[i].first + 1;
                return;
            }
        }
        cout << p[n - 1].first + 1;
    }
}

signed main() {
    IOS
    int T;
    T = 1;
    //cin >> T;
    while (T--)solve();
    return 0;
}

标签:AtCoder,ABC,const,int,sum,数组,Medicine,种药
From: https://www.cnblogs.com/WAinAll/p/17635837.html

相关文章

  • 【230816-8】▲ABC中,AB=4,BC=2,∠A=α=∠B/2,求:AC=?
    ......
  • ABC314 E和CF892 Div2D-E
    ABC314EE-Roulettes(atcoder.jp)大致意思是给你n个轮盘,第i个轮盘等概率的p[i]个点数,玩一次c[i]价钱,问要达到m点的最小期望花费是多少,每次可以任意选一个。乍一看很像背包,偏了方向,所以当时没有做出来。也考虑过其它的DP,关键是0怎么处理没搞明白所以赛后看他人的代码和题解......
  • [ABC134F] Permutation Oddness 题解
    题面定义一个\(1\simn\)的排列\(p\)的「怪异度」为\[\sum_{i=1}^n\left\lvertp_i-i\right\rvert\]求「怪异度」为\(k\)的\(1\simn\)的排列数,答案对\(10^9+7\)取模。题解考虑转化计算怪异度的过程,我们将值\(p_i\)排列在左侧,将下标\(i\)排列在右侧,构成一个......
  • [ABC134F] Permutation Oddness
    题目大意定义一个\(1\simn\)的排列\(p\)的「怪异度」为\[\sum_{i=1}^n|p_i-i|\]求「怪异度」为\(m\)的\(1\simn\)的排列数,答案对\(10^9+7\)取模。思路考虑把\(p_i\)和\(i\)看作小球与盒子,方便题意理解。考虑球与盒子的匹配。假设球在左侧,盒子在右侧,他们......
  • [ABC215D] Coprime 2
    题目大意给定一个长度为\(n\)的数列\(a\),要求出\(1\simm\)中与\(a\)中的所有元素互质的数。数据范围:\(1\\leq\n,m\\leq\10^5,1\\leq\a_i\\leq\10^5\)。思路模拟赛加强了数据,卡了\(\mathcal{O}(n\sqrt{n})\),于是来写一个\(\mathcal{O}(n\logn)\)的。考......
  • 『题解』ABC261Ex Game on Graph
    题目链接震惊!这个题竟然被神犇szs放进了博弈论里!我真的没看出来除了题面还有哪里像博弈论(也许是因为我菜)。转移方式很显然,按照题面说的做就行了。那么正解也就呼之欲出了。但是我知道大家都会正解,就是魔改的堆优化Dijkstra,所以我想说的是一种歪解,以及它是歪解的原因。歪解......
  • abc236_e
    abc236_e二分+判断如果是平均数,我们只需将每个数-mid,然后dp判断是和是否大于等于0即可如果是中位数,那么我们将a[i]<mid看作-1,a[i]>=mid看作1,然后dp判断是否大于0即可#include<algorithm>#include<cstdio>#include<cstring>#definefo(i,a,b)for(int(i)=(a);(i)<=(b);(i)......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA-3.14(atcoder.jp)题目提供了100位,所以直接用字符串输出#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);strings="3.14......
  • [ABC215D] Coprime 2 题解
    题意给定数列\(A_N\)和一个正整数\(M\),求出所有的\(1\lek\leM\)满足\(\foralli\in\left[1,N\right],\gcd(k,A_i)=1\)。题解本题存在线性复杂度算法。记\(\operatorname{lpf}(n)=[1<n]\min\{p:p\midn\}+[1=n]\),即\(n\)的最小质因数。特别地,\(n......
  • AtCoder Beginner Contest 314
    AtCoderBeginnerContest314-AtCoderA3.14voidsolve(){strings="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";intn;cin>>n;cout<<s.substr(0,n......