首页 > 其他分享 >Codeforces Round 980 (Div. 2)

Codeforces Round 980 (Div. 2)

时间:2024-10-22 19:45:29浏览次数:1  
标签:int 980 ans Codeforces long 柠檬水 按钮 Div ll

A. Profitable Interest Rate

题意:

Alice有 \(a\) 元钱。

银行有两种业务:

  • 业务A:存钱,但是要求最少要存 \(b\) 元
  • 业务B:花费x元,使得业务A中的要求 \(b\) 减少 \(2*x\) 元

求Alice最多可以存多少钱

分析

如果Alice要存钱,要使得\((ans=a-x)\)就要大于业务A的要求

\[ \left\{ \begin{matrix} a - x \ge b - 2 x \\ x\ge0 \end{matrix} \right. \Rightarrow x \ge max(b - a,0) \]

那么当x取得最小值时,ans最大,即 ans= max(a - max(b - a, 0),0);

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve()
{
    ll a, b;
    cin >> a >> b;
    cout << max(0ll,a - max(0ll, b - a)) << endl;
}


signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cout << setprecision(11) << fixed;
    int t;t=1;
    cin>>t;
    for(int i=1;i<=t;i++){
        //printf("Case %d: ",i);
        solve();
    }
}

B. Buying Lemonade

题目

有一台柠檬水自动售货机。机器上有 \(n\) 个槽位和 \(n\) 个按钮,每个槽位对应一个按钮,但你并不知道每个按钮对应的是哪个槽位。

当您按下第 \(i\) 个按钮时,有两种可能的事件:

  • 若 \(i\) 号槽位有至少一瓶柠檬水,则其中一瓶柠檬水会从这个槽位里掉下来,然后你会把它取走。
  • 若 \(i\) 号槽位没有柠檬水,则什么都不会发生。

柠檬水下落速度很快,因此您看不清它从哪个槽位掉出。您只知道每个槽位中瓶装柠檬水的数量 \(a_i (1 \le i \le n)\)。

您需要求出至少收到 \(k\) 瓶柠檬水的最小按按钮次数。

数据保证机器中至少存在 \(k\) 瓶柠檬水。

分析

很简单的一个策略,第一轮按下所有的按钮, 之后每一轮的只按上一轮中,有罐头落下的按钮。这样可以保证在最坏情况下按按钮次数最少。

在这种操作方式下,我们在第 \(i\) 轮会获得饮料的数量\(x\) 即\(a数组中大于等于i的元素个数\),按按钮的次数会在\(x\)的基础上多出\(y\) ,即\(a数组中等于i-1元素的个数\),

但是我们并不能一轮一轮模拟,所以我们将\(a\)数组递增排序,相当于是按照按钮被使用完的顺序先后遍历。

统计一下在使用完了第 \(i\) 个按钮后,还需要多少罐头 \(k\),以及现在按了多少次按钮 \(ans\),

每次计算在 \(i-1\) 按钮使用时,到 \(i\) 个按钮使用完时,可以获得的罐头数量 \(w\) ,即 \((a[i] - a[i - 1])*(n - i + 1)\),
那么这次操作次数就是在这次获得的具体罐头数加上上一个按钮被最后按下的那一次,当然 \(i=1\) 时没有上一个按钮。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n" 


void solve()
{
    int n, k; cin >> n >> k;
    vector<ll> a(n + 1, 0);
    for(int i = 1; i <= n; i ++)  cin >> a[i];
    sort(a.begin() + 1, a.end());
    ll ans = 0;

    for(int i = 1; i <= n; i ++) {
        ll w = 1ll * (a[i] - a[i - 1]) * (n - i + 1);
        if(k <= w) {
            ans += k + (i != 1);
            break;
        } else {
            ans += w + (i != 1);
            k -= w;
        }
    }
    cout << ans << endl;
}


signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cout << setprecision(11) << fixed;
    int t;t=1;
    cin>>t;
    for(int i=1;i<=t;i++){
        //printf("Case %d: ",i);
        solve();
    }
}

标签:int,980,ans,Codeforces,long,柠檬水,按钮,Div,ll
From: https://www.cnblogs.com/Haborym/p/18492572

相关文章

  • AT_agc064_c [AGC064C] Erase and Divide Game 题解
    先考虑所有\(l_i=r_i\)时怎么做,可以建出反向Trie树,问题转化为从根开始每次向左子树或右子树走,第一个拿到空子树的人输,直接在Trie上dp即可。考虑从叶子层开始对每一层的点合并两个子树的dp值,发现每一层值相同的连续段是较少的。于是可以维护这些连续段,每次合并要将每个......
  • Codeforces 977 E1 Digital Village 贪心证明
    问题重述(原题简化得来):给定一个简单联通无向图,包含n个顶点,每条边有一个正整数边权。定义两顶点距离为两顶点间路径最大边权的最小值。记k个顶点为特殊顶点,记f(i)为i顶点分别到k个顶点的k个距离中的最小距离,记score=f(1)+f(2)+...+f(n)。现在需要最小化score。则以下贪心算法是正确......
  • Codeforces Round 980 (Div. 2)
    A-ProfitableInterestRatevoidsolve(){ cin>>n>>m; if(n>=m)cout<<n<<'\n'; else { intc=m-n; if(c>=n)cout<<"0\n"; elsecout<<n-c<<'\n'; } return;}B-Buyin......
  • 「题解」Codeforces Round 980 (Div. 2)
    before\(A\simD\)的题解A.ProfitableInterestRateProblemA.ProfitableInterestRateSol&Code数学题,有\(a-x\geqb-2x\),得\(x=b-a\)。特判\(a\geqb\)以及\(a<x\)的情况即可。#include<bits/stdc++.h>#defineM10001#defineN......
  • Educational Codeforces Round 165 (Rated for Div. 2) - VP记录
    A.TwoFriends一共只有两种情况:存在\(A\)的最好朋友是\(B\)且\(B\)的最好朋友是\(A\)的情况:此时只需邀请这两个人即可。不存在上述情况:设某个人\(A\)的最好朋友是\(B\),\(B\)的最好朋友是\(C\),这时邀请\(A,B,C\)三个人就可使\(A,B\)到场。根据上述两种情......
  • Codeforces Round 979 (Div. 2)
    CodeforcesRound979(Div.2)总结A首先第一位的贡献一定是\(0\),然后考虑接下来\(n-1\)位,我们可以把最大值和最小值放在第一位和第二位,这样贡献就是\((max-min)\times(n-1)\)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#includ......
  • 「题解」Codeforces Round 979 (Div. 2)
    before\(A\simD\)的题解A.AGiftFromOrangutanProblemA.AGiftFromOrangutanSol&Code\(c_i-b_i\)最大就是\(a\)的最大值减最小值。将\(a\)的最大值\(x\)和最小值\(y\)放到头两位即可得到答案\((x-y)(n-1)\)。#include<bits/stdc++.h>#defineM......
  • Codeforces Round 980 (Div. 2) C. Concatenation of Arrays
    题目:给定n个数组a1,a2,…,an。每个数组的长度都是2。因此,ai=[ai,1,ai,2]。你需要将这些数组连接成一个长度为2n的单一数组,以便使结果数组中的逆序数最小。注意,你不需要实际计算逆序的数量。更正式地说,你需要选择一个长度为n的排列p,使得数组b=[ap1,1,ap1,2,......
  • CF round 979 div2(D-E)
    D容易观察到需要连续一段区间。这不单点修改区间查询,然后我思维就开始往线段树飘了。。。并且我到这里就以为做完了开始想实现,实际上性质都没观察准确。。但是因为这是一个1500的题所以显然有不用线段树的解。题解是差分做的,确实差分也可以操作区间观察到“LR”一定是隔断点,那......
  • Codeforces Round 979 div2 个人题解(A~E)
    CodeforcesRound979div2个人题解(A~E)Dashboard-CodeforcesRound979(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#inc......