首页 > 其他分享 >AtCoder ABC056D 题解

AtCoder ABC056D 题解

时间:2023-06-17 16:01:01浏览次数:60  
标签:AtCoder le ABC056D 题解 sum int ans

题目直达

0x00 思路

从大到小枚举每个元素,同时加入 \(sum\) 进行累计,当 \(k \le sum\) 时,便会返现之前的元素可以构成“好的组”(因为他们都大于 \(p_i\)),即有用的,所以要清空。

0x01 举个例子

3 6
1 4 3

我们对输入排序后,会得到 \(p\) 为。

4 3 1

这时,我们的 \(i = 1\),即 \(p_i = 4\)。

由于 \(ans ! \le k\),所以暂且将 \(p_i\) 设为没有用的,\(ans = 1\)。

\(i = 2\)时,\(ans \ge k\),所以之前的都有用,\(ans = 0\)。

\(i = 3\)时,由于 \(ans ! \le k\),所以 \(p_i\) 设为没有用的,\(ans = 1\)。

所以,printf("%d\n",ans);

时间复杂度 \(O(N)\) 到 \(O(\log_2N)\) 之间

0x02 AC Code

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int n,k;
int ans,sum;
int p[N];
bool cmp(int a,int b)
{
    return a>b;
}
//自定义sort排序
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&p[i]);
    }
    //输入
    sort(p+1,p+1+n,cmp);
    //从大到小排序
    for(int i=1;i<=n;i++)
    {
        ans=(sum+p[i]>=k?0:ans+1);
        //如果sum+当前的数值大于k,即可证明所有大于它的书均为有用的。
        sum+=(ans==0/*如果被清空了,就不加*/?0:p[i]);
        //累计数值
    }
    printf("%d\n",ans);
    //输出答案
    return 0;
}

0x03 AC记录

标签:AtCoder,le,ABC056D,题解,sum,int,ans
From: https://www.cnblogs.com/Redefinition/p/17487577.html

相关文章

  • AtCoder ABC228D 题解
    [ABC299D]FindbyQuery题解0x00题目分析题目传送门经过分析,我们得到的几个关键信息:\(n\le2\times10^5\)最多可以问法官\(20\)个问题。s[1]=0,s[n]=1分析\(n\)的范围,发现\(\log_n=17.6096\),刚好比\(20\)小一点点。这时便考虑二分的做法。看到s[1]=0,......
  • AtCoder ABC047D 题解
    题意理解&分析:大概的题意应该是十分清晰的,就是一个人要从\(1\)到\(n\)的城市中买苹果。另一个人要其中调整价格。这里的调整也不需要太多,就\(1\)就可以了。但是,如果有多组购买方案可以得到相同的利润,就还需要将其他相同的价格一并调整。这道题的关键就在于求出有几组购买......
  • CF1732D1 题解
    CF1732D1Balance题解题目解释输入一个\(op\)和\(x\),\(op\)有\(2\)种情况。\(op\)为+,则将\(x\)加入到集合中。\(op\)为?,则找到一个最小的\(k\),使\(k\timesx\)不在合集中。题目非常简单明了。具体实现这时,看到这句话:\(1\lex\le10^{18}\),所以不可......
  • 题解 CF1830C【Hyperregular Bracket Strings】
    卡特兰数一个长为\(2n\)的序列,填入括号,有多少种合法方案?\(C_n=\sum_iC_iC_{n-i-1}\),其中\(C_0=C_1=1\)。它的封闭形式是\(C_n=\binom{2n}{n}-\binom{2n}{n-1}\)。problem给定一个长度\(n\)和\(k\)个子区间\(\{[l1​,r1​],[l2​,r2​],…,[lk​,rk​]\}\)。问有多......
  • 【题解】CF754D Fedor and coupons(优先队列)
    【题解】CF754DFedorandcoupons题目链接CF754DFedorandcouponsCF1029CMaximalIntersection后者是前者的加强版。思路分析最开始,先考虑不删区间\((k=0)\)的情况:也就是给你一大堆区间,让你找他们的交集。这个还是比较好想的,我们刚开始让第二个区间与第一个区间相交......
  • AtCoder Beginner Contest 221 G Jumping sequence
    洛谷传送门AtCoder传送门这个数据范围让我们不得不往背包想。但是两维相互限制。考虑坐标系旋转\(45°\),转化为两维不相互限制。那我们现在相当于要安排正负号,使得\(\sum\limits_{i=1}^n\pmd_i\)等于一个给定的值\(K\)。考虑两边加上\(\sum\limits_{i=1}^nd_i\)......
  • 【CF1841C 题解】
    首先,我们把\(s\)翻转。考虑dp,\(f_{i,j,k}\)表示到了第\(i\)个字符,操作了\(j\)个字符,最大的字符为\(k\)的最大值。转移时枚举\(i-1\)的最大字符\(\ell(0\le\ell<5)\)。不操作第\(i\)个字符;\(f_{i,j,k}=\max\{f_{i-1,j,\ell}+w\}\)。操作第\(i\)......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后可以发现......