首页 > 其他分享 >「杂题乱刷」CF1904B

「杂题乱刷」CF1904B

时间:2023-12-10 13:33:51浏览次数:27  
标签:数字 forl long while CF1904B ans 杂题 id

题目链接

CF1904B Collecting Game

题意简述

给你一个由 \(n\) 个正整数组成的序列 \(a\) 和一个分数。如果你的分数大于或等于 \(a_i\),那么你可以将分数增加 \(a_i\),并从序列中删除 \(a_i\),你需要求出对于每一个 \(a_i\) 为你的分数时你可以从这个序列中删除数的最大数量。

解题思路

我们可以考虑将询问离线并将数字从小到大排序,然后维护一个指针 \(l\),代表当前数字能到达的数,因为这样维护的话我们会发现,当一个数字比另一个数字大时,那么它所能到达的数字是不可能比比它小的数字小的,因此这样贪心是正确的。

参考代码

#include<bits/stdc++.h>
using namespace std;
long long t,n,sum,l,ans[100010];
struct node{
	long long x,id;
}a[100010];
bool cmp(node x,node y){
	return x.x<y.x;
}
#define forl(i,a,b) for(int i=a;i<=b;i++)
#define forr(i,a,b) for(int i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
int main()
{
	IOS;
	cin>>t;
	while(t--)
	{
		cin>>n;
		bool vis[n+1]={0};
		forl(i,1,n)
			cin>>a[i].x,a[i].id=i;
		sort(a+1,a+1+n,cmp);
		sum=0,l=1;
		forl(i,1,n)
		{
			while(l<=i)
			{
				if(!vis[l])
					vis[l]=1,sum+=a[l].x;
				l++;
			}
			if(sum>=a[l].x)
				while(sum>=a[l].x)
				{
					//cout<<l<<endl;
					if(!vis[l])
						vis[l]=1,sum+=a[l].x;
					if(sum<a[l+1].x || l>=n)
					{
						ans[a[i].id]=l-1;
						break;
					}
					l++;
				}
			else
				ans[a[i].id]=l-2;
		}
		forl(i,1,n)
		{
			if(ans[i]==n)
				ans[i]--;
			cout<<ans[i]<<" ";
		}
		cout<<endl;
	}
	QwQ;
}
/*
Hack:
5
1 2 3 7 10
*/

标签:数字,forl,long,while,CF1904B,ans,杂题,id
From: https://www.cnblogs.com/wangmarui/p/17892553.html

相关文章

  • 「杂题乱刷」洛谷P1216
    题目链接一道dp的入门题。\(O(2^n)\):考虑直接爆搜,可以考虑到所有情况。\(O(n^2)\):考虑\(dp\),设\(dp_{i,j}\)代表到达第\(i\)层第\(j\)个数所能达到的最大值。状态转移方程为\(dp_{i,j}=a_{i,j}+\max(dp_{i-1,j-1},dp_{i-1,j})\)。最终答案就是\(\max(dp_{n,1},d......
  • 「杂题乱刷」洛谷P1544
    题目链接数字三角形的变形。直接在原来的基础上加个判断\(3\)倍的就行了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans=-1e18,a[110][110],dp[110][110][5010];#definelc(x)x<<1#definerc(x)x<<1|1#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P2285
    题目传送门一道小清新动态规划题,直接设\(dp[i]\)表示前\(i\)个鼹鼠最多能打到几个,然后状态转移方程也很好想了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans,dp[10010],x[10010],y[10010],times[10010];#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P1064
    题目传送门一道算是dp的板子题了。题意大概就是01背包+捆绑。首先回顾一下01背包,一个比较基础的dp题,状态转移方程也很好想,是\(dp[i][j]=\max(dp[i][j],dp[i-1][j-w[i]]+v[i])\)。代码实现如下:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlo......
  • 杂题乱写 1
    用树剖补完了普及组OJ所有LCA的题DistanceQueries距离咨询POJ-1986翻译:FJ有\(N(2\leN\le40000)\)个农场,标号\(1\)到\(N\)。\(M(2\leM\le40000)\)条的不同的垂直或水平的道路连结着农场,道路的长度不超过\(1000\).这些农场的分布就像下面的地图一样,图中农场用\(F1\cdotsF7\)......
  • 网络流杂题
    一道一道记太浪费文章篇数了。先记几种dinic的复杂度。一般网络:\(O(n^2m)\)各边容量为\(1\)的网络:\(O(m\min\{m^{\frac{1}{2}},n^{\frac{2}{3}}\})\)二分图:\(O(m\sqrtn)\)更详细的分析。最大流UVA10735混合图的欧拉回路存在欧拉回路的判断条件:每个点出度=入度......
  • 【杂题乱写】2023-11 #2
    ARC147CFindthemaximumLandtheminimumRtobemLandmRrespectively.IfmL<=mRholds,wecansetevery\(x_i\)tobemLandthecontributionwillbe0.Otherwisewe'dgreedilyset\(R_{\arg\minR}=mR\)and\(L_{\arg\maxL}=mL\).All......
  • 「杂题乱刷」CF1585B
    原题链接CF1585BArrayEversion题目简述现在有一个长度为\(n\)的序列\(a\),每次操作将\(a\)中不大于序列\(a\)中最后一个数的元素按照在\(a\)序列中的顺序放入\(b\)序列中,大于序列\(a\)中最后一个数的元素同样按照在\(a\)中的顺序放入\(c\)序列中,然后再将\(c......
  • 「杂题乱刷」CF468A
    原题链接CF468A24Game题目简述现在有一个序列\(n\)包含\(n\)个整数\(1\simn\),如果我们能经过加减乘三种操作让这个序列只剩下\(24\),如果可以,输出YES并给出构造方案,否则输出NO。解题思路首先不难看出,如果\(n\)小于\(4\)的话,那么是一定不能构造出方案的,因为无......
  • 「杂题乱刷」洛谷P9515
    原题链接P9515「JOC-1A」限时签到题意简述有一条公路上有\(n\)个商店,每个商店分别在不同的时刻开放,求如何在\(t\)时刻之前到达\(f\)点并且到达最多开放的商店的数量,特别的,一个时刻只能走一格。解题思路这一道题是一道贪心题。首先,因为要在\(t\)时刻之前到达\(f\)......