ICPC训练赛补题集

news2024/10/6 10:27:14

ICPC训练赛补题集


文章目录

  • ICPC训练赛补题集
    • D - Fast and Fat (负重越野)
    • I-路径规划
    • G. Inscryption(邪恶铭刻)
    • NEW Houses

D - Fast and Fat (负重越野)

原题链接:原题链接
题意:体重大的背体重小的速度不变,体重小的背体重大的速度会变化,变化 v i − ( w j − w i ) vi−(wj−wi) vi(wjwi)程度。有T组数据,有多组测试数据。第一行输入一个整数T 表示测试数据组数,对于每组测试数据:
第一行输入一个整数n表示队员人数。
对于接下来n行,第 i i i行输入两个整数 v i v_i vi w i w_i wi,表示速度和体重的大小。
The optimal strategy for the sample test case is shown as follows:

  • Let member 1 1 1 carry member 4 4 4. As w 1 > w 4 w_1 > w_4 w1>w4, member 1 1 1’s speed remains unchanged, which is still 10 10 10.
  • Let member 3 3 3 carry member 2 2 2. As w 3 < w 2 w_3 < w_2 w3<w2, member 3 3 3’s speed will decrease by w 2 − w 3 = 2 w_2 - w_3 = 2 w2w3=2 and becomes 10 − 2 = 8 10 - 2 = 8 102=8.
  • Member 5 5 5 shall move alone. His/Her speed is 9 9 9.
    So the answer is 8 8 8.
    思路:利用二分的方法,二分答案,尽量往右找,最后输出 l l l的值就是答案。主要思想是check函数里面的内容,主要就是找出来速度低于mid的,判断它们是否能被背起来达到速度最小是mid,速度大于mid的都是来背或者不背其它人的。当速度小于mid的人数大于速度大于等于mid的人时,这个mid一定不能用,要 r e t u r n 0 return 0 return0掉。而且还要判断能否通过别人背起来达到mid的速度。
#include <bits/stdc++.h>
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair<int,int>
using namespace std;
const int N = 1e5+5;
//int a[N],b[N];
int n;
vector<PII> a;
int check(int mid)
{
	priority_queue <int> b,c;//这里用到的优先队列会从大到小自动排序。
	for (int i=0;i<n;i++)
	{
		if (a[i].fi>=mid)
		{
			b.push(a[i].fi+a[i].se);
		}
		else 
		{
			c.push(a[i].se);
		}
	}
	if (b.size()<c.size()) return 0;
	while (b.size()&&c.size())
	{
		if (b.top()-c.top()>=mid)
		{
			b.pop();c.pop();
		}
		else return 0;
	}
	if (!c.empty()) return 0;
	return 1;
	
}

void solve ()
{	
   	a.clear();//注意这里一定要清空vector的值
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		int x,y;cin>>x>>y;
		a.push_back({x,y});//这里用vector加pair的方式存入两个变量,也可以用结构体啥的
	}
	int l=0,r=1e9+1,mid;//标准二分答案板子
	while (l<r)
	{
		int mid=l+r+1>>1;
		if (check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l<<'\n';
}

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

I-路径规划

原题链接:此处跳转
刚拿到这一题的时候一点思路都没有,更别说能想到是二分的方法来写了。但是看完答案过后“柳暗花明又一村”,豁然开朗。因为有最大的字眼,所以就用二分?反正这一题用二分是正解。
题意:给出 n × m n×m n×m的序列, 从左上角走到右下角找到最大的 M E X MEX MEX M E X MEX MEX是路径中没出现的最小非负整数,例如路径中的数字为“0 2 4 5 6”,那么 M E X MEX MEX的值就是1,因为1没有出现过。因此我们就要找出来最大的 M E X MEX MEX的值;
 思路:因为范围比较大 1 ≤ n , m ≤ 1 0 6 1 \le n, m \le 10^6 1n,m106, 1 ≤ n × m ≤ 1 0 6 1 \le n \times m \le 10^6 1n×m106 所以我们用一般的二维数组肯定是存不了的,会爆掉,我们这里用到cin>>a[i*m+j](i为行,j为列)这样的方式给数组存进来。输入问题解决之后就要用到很奇妙的思维了,因为要求最大的mex,我们这里可以用二分的思想,尽量向右找,然后输出l即可。那么check函数该怎么写?怎么写?怎么写?问三遍。这里的思维很奇妙,我们知道如果要让一个数符合标准,例如3,让3成为最小的没出现过的数,我们就要找到它之前的所有数字“0 1 2 ”都要找到,那么重中之重就是能不能找到这几个数字。因为只能向右和向下走,那么我们可以定义一个k来存储位置,判断能不能往下一个方向出发。例如:

bool check (int x)
{
	int k=0;//定义一个k
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		{
			if (a[i*m+j]<x)//找小于x的数字
			{
				if (k>j) return false;//如果走不到这个位置,无法到达就肯定不符合条件,二分return掉
				k=j;//更改位置
			}
		}
	}
	return true;//如果都符合条件就return true
}

加上二分的模板之后就能轻松AC了,主要还是要知道这是一到二分的题目,看不出来那这道题还写个集贸,直接寄了吧

#include <bits/stdc++.h>
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair<int,int>
using namespace std;
const int N = 1e6+5;
int a[N],b[N];
int n,m;
bool check (int x)
{
	int k=0;
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		{
			if (a[i*m+j]<x)
			{
				if (k>j) return false;
				k=j;
			}
		}
	}
	return true;
}

void solve ()
{
	cin>>n>>m;
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		cin>>a[i*m+j];
	}
	int l=0,r=n*m,mid;
	while (l<r)
	{
		int mid=l+r+1>>1;
		if (check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l<<'\n';
}

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

G. Inscryption(邪恶铭刻)

 原题链接:点击此处
 题意:有T组数据,每组数据有一个n,接下来有n个数据

题意
如图所示,一些题目要求。分别用1 -1 0 来表示。
 这道题我们写了好久没有写出来,果真还是太菜了,看完别人的代码感觉好简单,但是这种思路我们肯定也想不到。
 思路:用sum来表示总共的攻击力,用cnt来表示有多少人,用choice来表示可以反悔多少次。这个反悔很奇妙,真的太妙了。因为0可以变成1或者-1.假设我们就让0变成-1,因为尽量变成-1才会让平均数最大。假设先变成-1,再往后看,如果后面行不通了,就反悔回来,sum++,cnt++,choice–。主要思想看代码

#include <bits/stdc++.h>
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair<int,int>
using namespace std;
const int N = 1e5+5;
int a[N],b[N];
void solve ()
{
	int n;cin>>n;int flag=0;
	int sum=1,cnt=1,choice=0;
	for (int i=1;i<=n;i++)
	{
		int x;cin>>x;
		if (x==1) sum++,cnt++;//这种情况只能sum++,cnt++
		else if (x==-1)
		{
			if (cnt>1) cnt--;//为-1的时候cnt--,sum不用减,因为牺牲了,但攻击力给别人了
			else if (choice>=1) sum++,cnt++,choice--;//如果cnt不大于1那么看看是否能反悔,能反悔就可以,否则输出-1
			else 
			flag=1;
		}
		else 
		{
			if (cnt>1) cnt--,choice++;//假设变成-1
			else sum++,cnt++;//变成1
		}
	}
	int k=__gcd(sum,cnt);
	if (flag==1) cout<<"-1"<<'\n';	
	else cout<<sum/k<<' '<<cnt/k<<'\n';//约分,直接求出最大公约数再除以他们就ok了,但是手写gcd函数会更快
}

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

 感觉就是考了一个思维,没想到我们却写的如此稀碎,能写对的也就最大公约数的函数了。怎么办呢????
还是 cai jiu duo lian吧


NEW Houses

原题链接 :点击这里
 题意 :给出了每个人的自己住和有领居一起住的满意度,问有n个人,m个房间改怎么安排才能使这n个人满意度最大
这就是一个贪心的问题,将满意度最大的安排起来使大家的满意度最大。
因为没有领居的话他能占两格或者三格,所以我们就要注重注意一下这没有领居的人,我们先给这些人的位置安排好,有领居的人的位置就好安排了。那么怎么安排n个人独居的人数呢?
我们可以发现,当n=m的时候是没有能一个人住的。我们设sum为能独居的人数,我们通过计算可以得知出来sum在各个情况下的值

if(n==m) sum=0;
else if (m>=2*n-1) sum=n;
else sum=m-n;
知道了各个情况下的最多能有多少个独居人数就可以进行下面的操作

  • 这里特判一下当n==1的时候,直接输出独居的满意度即可
    以下代码是输入的代码,定义一个结构体存入数据,如果独居满意度大于有领居的时候将他们存入定义的vector数组里面,类型为结构体类型,类似于pair。因为这样的数据可能独居可能合居,所以不能单纯只存入一个数据。再将只能合居的人存入另一个vector(类型为int)数组里面
for (int i=1;i<=n;i++)
	{
		cin>>ss[i].a>>ss[i].b;
		if (ss[i].b-ss[i].a>0)
		{
			a.push_back(ss[i]);
		}
		else b.push_back(ss[i].a);
	}

整体思路就是先将独居的放入房间,再放合居的人,但是特判一下当只有一个不能独居的时候,是让他独居,还是和独居的人合居,这要进行一次判断。其他的就直接把独居的人数的满意度加起来,保证不能超过sum个独居的人数,再加以优化

#include <bits/stdc++.h>
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair<int,int>
using namespace std;
const int N = 5e5+5;

struct node
{
	int a,b;
}ss[N];

bool cmp (node q,node w)
{
	return (q.b-q.a)>(w.b-w.a);
}

void solve ()
{
	vector<node> a;
	vector<int>b;
	int n,m;cin>>n>>m;
	int sum=0;
	if(n==m) sum=0;
	else if (m>=2*n-1) sum=n;
	else sum=m-n;
	if (n==1)
	{
		int x,y;cin>>x>>y;
		cout<<y<<'\n';return ;
	}
	for (int i=1;i<=n;i++)
	{
		cin>>ss[i].a>>ss[i].b;
		if (ss[i].b-ss[i].a>0)
		{
			a.push_back(ss[i]);
		}
		else b.push_back(ss[i].a);
	}
	sort(a.begin(),a.end(),cmp);
	if (a.size()==n-1&&sum==n)
	{
		sum-=2;int ans1=0;
		for (auto i : a)
		{
			if (sum)
			{
				ans1+=i.b;
				sum--;
			}
			else 
			{
				ans1+=i.a;
			}
		}
		for (auto i : b)
		ans1+=i;
		int ans2 =0;
		for (int i=1;i<=n;i++)
		ans2+=ss[i].b;
		cout<<max(ans1,ans2)<<'\n';
	}
	else 
	{
		int ans=0;
		for (auto i : a)
		{
			if (sum)
			{
				ans+=i.b;
				sum--;
			}
			else 
			{
				ans+=i.a;
			}
		}
		for (auto i : b)
		ans+=i;
		cout<<ans<<'\n';
	}
}

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

持续更新中 . . . . . . . . . . . . . . . . . . . . . . . ....................... .......................

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野&#xff0c;这种集吸、拖、洗功能于一体的清洁工具&#xff0c;凭借其高效便捷的特点&#xff0c;成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间&#xff0c;节省体力&#xff0c;还能提高清洁效果。然而&#xff0c;面对琳琅满目的洗地机品…

多系统集成的项目周期为何普遍较长?

在现代企业的运营中&#xff0c;各种信息系统的集成已成为提升效率和竞争力的关键。然而&#xff0c;当工厂的ERP系统需要与MES、SRM、WMS、CRM等其他系统集成时&#xff0c;项目周期往往长达一年以上&#xff0c;这不仅耗费时间、人力和财力&#xff0c;还可能影响企业的正常运…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA&#xff1a;革新电子设计&#xff0c;让高效与便捷触手可及 在快节奏的现代生活中&#xff0c;科技日新月异&#xff0c;各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言&#xff0c;SmartEDA的出现&#xff0c;无疑是一场革命性的变革。它以其高效…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…

ssm137基于SSM框架的微博系统+vue

微博系统网站的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就…

惯性测量单元M-G366PDG提供低误差系数的解决方案

人形机器人、自动驾驶的快速发展&#xff0c;促成了惯性测量单元(IMU)的爆火市场。据相关研究报告统计&#xff0c;IMU全球市场规模从2018年的99.94亿美元增加至2021年的135.95亿美元预计2027年将达到222.53亿美元&#xff0c;2021年至2027年复合增长率达8.56%。而由于智能技术…

USST新生训练赛div2+div3题解

目录 前言题解部分B Ichihime and Triangle(800)题目大意题解代码实现 C Kana and Dragon Quest game(900)题目大意题解代码实现 J Squares and Cubes(800)题目大意题解代码实现 F Double Sort(1200)题目大意题解代码实现 I Minimize the Thickness(1100)题目大意题解代码实现 …

三十六计的笔记

系列文章目录 三十六计的笔记 文章目录 系列文章目录1、瞒天过海2、围魏救赵3、借刀杀人4、以逸待劳5、趁火打劫6、声东击西7、无中生有8、暗渡陈仓9、隔岸观火10、笑里藏刀11、李代桃僵12、顺手牵羊13、打草惊蛇14、借尸还魂15、调虎离山16、欲擒故纵17、抛砖引玉18、擒贼擒王…

【LeetCode算法】第88题:合并两个有序数组

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定义一个mn长度的辅助数组&#xff0c;从头遍历这两个数组&#xff0c;谁小就放进辅助数组中并且对应往后走&#xff0c;最后使用memcpy函…

基于Java实现的图书管理系统

前言&#xff1a;该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能&#xff0c;分为两个用户群体&#xff1a;管理者和普通用户。使用了类与对象&#xff0c;封装继承多态&#xff0c;抽象类和接口等Java基础知识。 一.思路 面向对象三部曲&#xff1a;找对象&…

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…

统计每个活动的用户访问量,且每个用户仅统计一次

场景&#xff1a;统计每个活动的用户访问量&#xff0c;且每个用户仅统计一次。 首先活动表是已经存在了的&#xff0c;一般情况下&#xff0c;我们都会在创建一个用户访问表&#xff0c;其中唯一主键是用户ID活动ID作为唯一主键 create table user_visist_activity_record(i…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

美业系统SaaS收银系统源码-顾客在系统付款了但系统未显示怎么办?美业系统实测

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 提供门店名称、付款凭证和会员手机号 2. 到订单明细查询&#xff0c; 按门店名称和会员手机号查询看是否有相…

高工咨询:《2024中国人形机器人产业发展蓝皮书》

高工咨询所发布的《2024中国人形机器人产业发展蓝皮书》全面梳理了人形机器人产业的发展现状、政策环境、资本市场、技术发展、市场前景以及面临的机遇与挑战等情况。 人形机器人是当今世界科技领域最具潜力和前景的产业之一。随着科技的不断进步和人 工智能技术的快速发展&…

轻松拿捏C语言——二分查找

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; 目录&#x1f389; 一、介绍&#x1f308; 二、步骤&#x1f319; 三、代码☀️ 一、介绍 二分查找是一种在有序数组中…

DINO中为什么教师模型用大图,学生模型用小图

在 DINO&#xff08;可以理解为由DIstillation和NO labels的缩写&#xff09;中&#xff0c;使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说&#xff0c;教师模型使用大图&#xff08;global views&#xff09;&#xff0c;学生模型则同时使用大…

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…