0
点赞
收藏
分享

微信扫一扫

AcWing1969. 品种邻近

正义的杰克船长 2022-01-13 阅读 32
c++

农夫约翰的 N 头奶牛排成一排,每头奶牛都用其品种 ID 进行描述。

如果两头相同品种的牛靠得太近,它们就会吵架。

具体的说,如果同一品种的两头奶牛在队列中的位置相差不超过 K,我们就称这是一对拥挤的牛。

第一行包含两个整数 N 和 K。

接下来 N 行,每行包含一个整数表示队列中一头奶牛的品种 ID。

输出品种 ID 最大的拥挤奶牛对的品种ID。

如果不存在拥挤奶牛队,则输出 −1。

1≤N≤50000
1≤K<N
品种 ID 范围 [0,106]

6 3
7
3
4
2
3
4
4

一对品种 ID 为 3 的奶牛以及一对品种 ID 为 4 的奶牛属于拥挤奶牛对。

所以,最大拥挤奶牛对的品种 ID 为 4。

暴力法(答案正确输出超限理解思路即可) 

#include<iostream>
#define P 50000
using namespace std;
struct COW//定义结构体牛牛储存 
{
	int ID;//牛牛ID 
	int index;//牛牛序号 
};
int main()
{
	int N,K,i,j; 
	cin>>N>>K;
	struct COW cow[P];
	for(i=0;i<N;i++)//对于牛牛结构体进行数据输入 
	{
		cin>>cow[i].ID;
		cow[i].index=i;
	}
	for(i=0;i<N-1;i++)//利用交换法对于牛牛结构体内的数据全体进行从大到小排序 
	{
		for(j=i+1;j<N;j++)
		{
			if(cow[i].ID<cow[j].ID)
			{
				int t;
				
				t=cow[i].ID;
				cow[i].ID=cow[j].ID;
				cow[j].ID=t;
				
				int o;
				o=cow[i].index;
				cow[i].index=cow[j].index;
				cow[j].index=o;
			}
		}
	}
	for(i=0;i<N-1;i++)//遍历结构体,进行筛选数据 
	{
		j=i+1;
		while(j<N&&cow[i].ID==cow[j].ID)//若相邻数据相同,计算数据相同的序号差值 
		{
			int s=cow[i].index-cow[j].index;//存储差值 
			if(abs(s)<=K)
			{
				printf("%d",cow[j].ID);//满足条件进行输出 
				return 0;
			}
			j++;
		}
	}
	
	printf("-1");//不满足条件输出-1 
}

c++调用函数库简单循环法

#include<iostream>
#include<algorithm>//调用库函数max 
using namespace std;
const int P=10000000;//数组数据用const常量开大点 
int main()
{
	int a[P];//数组中的下角标为牛牛ID,数组中元素的大小为牛牛的地址 
	int N,K;
	cin>>N>>K;
	int result=-1;//默认结果为1 
	for(int i=1;i<=N;i++)
	{
		int num;
		cin>>num;//输入牛牛ID 
		//如果牛牛ID已经存在证明先前出现,进行判断 
		if(a[num]!=0&&i-a[num]<=K)//如果牛牛ID之前存在那么判断距离是否满足 
		{
			result=max(result,num);//求取较大牛牛ID作为答案 
		}
		a[num]=i;//若牛牛ID首次出现则为其存储牛牛地址 
	}
	cout<<result;//输出结果 
	return 0;
}

 #include<algorithm> max(a,b)求取a、b的最大值并用一个值接收

举报

相关推荐

0 条评论