首页 > 其他分享 >P2678 [NOIP2015 提高组] 跳石头

P2678 [NOIP2015 提高组] 跳石头

时间:2024-04-06 18:58:28浏览次数:36  
标签:aa cha NOIP2015 node bb P2678 石头 int include

思路:

运用两次数组比较,按照序号和前后相差距离的大小比较排序。

代码:首次尝试30分

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>

using namespace std;
 
int m,n;
long long l;
int a[50010];
struct node{
	int id;
	int cha;
}; 
node b[50010];
node c[50010];

bool cmp(node aa,node bb){
	int id1 = aa.id;
	int id2 = bb.id;
	
	if(aa.cha == bb.cha){
		int x1 = b[id1].cha + b[id1+1].cha;
		int x2 = b[id2].cha + b[id2+1].cha;
		if(x1<x2) return aa.cha + b[id1+1].cha > bb.cha + b[id2+1].cha;
		else return aa.cha + b[id1+1].cha < bb.cha + b[id2+1].cha;
	}
	return aa.cha < bb.cha;
}
bool cmp1(node aa,node bb){
	return aa.id<bb.id;
}
int main()
{
	scanf("%lld%d%d",&l,&n,&m);//分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。

	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i].cha = a[i] - a[i-1];
		b[i].id = i;
	}
	//最多移走m个石头,在输入的时候将相邻最小的两块石头移走,看移走m块和m-1块是不是效果相同 
	//差数组里存下标和“与前一块石头的距离差”	 
	sort(b+1,b+n+1,cmp);
	//先把前m个单独存储出来
	for(int i=1;i<=m;i++){
		c[i].id = b[i].id;
		c[i].cha = b[i].cha;
	} 
	sort(b+1,b+n+1,cmp1);
	
	for(int i=1;i<=m;i++){
		//看看移走哪几块
//		cout<<c[i].cha<<" "<<c[i].id<<endl;
		//更新
		int id = c[i].id;
		int cha = c[i].cha;
		
		b[id+1].cha += cha;		 
	}
	
//	for(int i=1;i<=n;i++){
//		printf("%d %d\n",b[i].id, b[i].cha);
//	}
	sort(b+1,b+n+1,cmp);
	
	cout<<b[m+1].cha;
	return 0;
 } 

结果:

 AC代码:借鉴洛谷题解zhaowangji的代码加上自己的理解修改代码如下

//采用二分,二分的是最终的答案距离。
//设最大能跳跃的距离为mid,看在该条件下需要移走的石头 
//如果需要移走的石头数大于m,说明说明该mid太大,答案在左半段

//采用二分,二分的是最终的答案距离。
//设最大能跳跃的距离为mid,看在该条件下需要移走的石头 
//如果需要移走的石头数大于m,说明该mid太小,答案在右半段
 #include<iostream>
 using namespace std;
 int l,m,n;
 int dis[50007];//每个石头到起点的距离
 int main()
 {
 	cin>>l>>n>>m;
 	//第i个石头距离开头的长度 
 	for(int i=1;i<=n;i++)
		cin>>dis[i];
	dis[n+1]=l;//终点
	//二分时左闭右开 
	int left=0,right=l+1,mid;//两个极值,但注意left可以取到,而right不能取到
	while(left+1<right)
	{
		mid=(left+right)/2;
		int sum=0,x=dis[0];//sum是当前答案下要移多少石头,x是当前起跳的石头(初始为起点)
		for(int i=1;i<=n+1;i++)//注意是n+1(因为有终点啊)
		{
			if(dis[i] - x < mid)
			    sum++;//起跳距离小于当前答案,说明要移走
		else 
			x=dis[i];//换到当前位置起跳
        }
		if(sum<=m)	
			left=mid;//要移的数量小于等于题目要求,说明答案还可以更大
		else 
			right=mid;//该情况数值过大,答案在左半段 
	}
	cout<<left<<endl;//left即为答案
	return 0;
 } 

结果:

标签:aa,cha,NOIP2015,node,bb,P2678,石头,int,include
From: https://blog.csdn.net/2401_82736456/article/details/137376842

相关文章

  • 二分答案跳石头游戏
    步骤: 输入:用户输入了三个整数,分别表示石头的总长度l,石头的数量n,以及最多可以撤去的石头数量m。初始化石头位置数组:创建一个长度为n+2的数组arr,用于存储每块石头的位置。数组的第一项和最后一项分别表示起点和终点的位置,因此初始化为0和l。计算最小相邻石头间距:循环......
  • 基于深度学习的石头剪刀布手势识别(网页版+YOLOv8_v7_v6_v5代码+训练数据集)
    摘要:本文深入研究了基于YOLOv8/v7/v6/v5的石头剪刀布手势识别系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和......
  • 宝石与石头
    宝石与石头链接:https://leetcode.cn/problems/jewels-and-stones/description/给你⼀个字符串jewels代表石头中宝石的类型,另有⼀个字符串stones代表你拥有的石头。stones中每个字符代表了⼀种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小......
  • P2615 [NOIP2015 提高组] 神奇的幻方
    P2615[NOIP2015提高组]神奇的幻方[NOIP2015提高组]神奇的幻方题目背景NOIp2015提高组Day1T1题目描述幻方是一种很神奇的\(N\timesN\)矩阵:它由数字\(1,2,3,\cdots\cdots,N\timesN\)构成,且每行、每列及两条对角线上的数字之和都相同。当\(N\)为奇数时,我们......
  • (43/60)最后一块石头的重量Ⅱ、目标和、一和零
    day43最后一块石头的重量Ⅱleetcode:1049.最后一块石头的重量II动态规划思路a-b+c-d+e-f=(a+c+e)-(b+d+f)等效于两堆石头相碰,最小可能重量就是最接近平均的两堆相碰。复杂度分析时间复杂度:O(N^2)。空间复杂度:O(N)。代码实现C++:classSolution{public:/*......
  • 一维数组_ 石头剪刀布(老是感觉有错误的地方,请指正)
    任务描述石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问......
  • 代码随想录算法训练营第四十三天 | 474.一和零,● 494. 目标和 ,1049. 最后一块石头的
     1049.最后一块石头的重量II 已解答中等 相关标签相关企业 提示 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,......
  • 代码随想录算法训练营第四十三天|● 1049. 最后一块石头的重量 II ● 494. 目标和
    最后一块石头的重量 II 题目链接:1049.最后一块石头的重量II-力扣(LeetCode)思路:尽可能将石头分成重量相近的两堆,结果一定最小,因此问题可以转换为分割子集。dp[i]的含义是背包容量为i的背包能装下的最大重量,由于题目中最大重量是15000,所以我们申请15001的vector。注意,结果不......
  • Unity+Houdini+SP+SD 程序化风格化石头
    Houdini程序化模型整体思路:先生成一个基础模型,再基于该模型进行cutoff、控制拐角,随后转换为低模,最后uv映射、物体的像素密度、贴图大小基础模型基础形状采用Box,再使用PointJitter改变形状,最后添加normal为后续的cutoff做铺垫大致形状如下基础形状基于point个数使用f......
  • 洛谷题单指南-二分查找与二分答案-P2678 [NOIP2015 提高组] 跳石头
    原题链接:https://www.luogu.com.cn/problem/P2678题意解读:最短跳跃距离越大,要移走的石头就越多,因此可以根据最短跳跃距离的不同把情况分为两类:移走的石头数<=M、移走的石头数>M,对最短跳跃距离二分即可。解题思路:二分的判定条件如下:对于给定最短跳跃距离,需要计算移走的石头数,......