cf. ConneR and the A.R.C. Markland-N

题意很好理解,主要就是n的范围是1e9,数组的话是存不下的。这个时候可以想到用map或vector来代替数组发挥作用。
废话不多说,上代码:
map:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
map<int , bool> a;
int main()
{
	int t , n , s , k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d %d",&n,&s,&k);
		a.clear();
		while(k--)
		{
			int d;
			scanf("%d",&d);
			a[d] = 1;
		}
		if(a[s]==0)
		{
			printf("0\n");
			continue;
		}
		else
		{
			int i = s , j = s;
			while(i>=1&&a[i]==1)
			{
				i--;
			}
			while(j<=n&&a[j]==1)
			{
				j++;
			}
			if(i==0)
			{
				printf("%d\n",j-s);
			}
			else if(j==n+1)
			{
				printf("%d\n",s-i);
			}
			else if((s-i)<=(j-s))
			{
				printf("%d\n",s-i);
			}
			else
			{
				printf("%d\n",j-s);
			}
			continue;
		}
	}
	return 0;
}

vector:

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
vector<int> a;
int main()
{
	int n , k , s , t;
	cin >> t;
	while(t--)
	{
		cin >> n >> s >> k;
		a.clear();
		a.resize(k);//数组a开到这么大 
		for(int i = 0 ; i < k ; i++)
		{
			int d;
			cin >> d;
			a.push_back(d);
		}
		for(int i = 0 ; i <= k ; i++)
		{
			if((s-i)>=1&&find(a.begin(),a.end(),s-i)==a.end())
			{
				cout << i << endl;
				break;
			}
			if((s+i)<=n&&find(a.begin(),a.end(),s+i)==a.end())
			{
				cout << i << endl;
				break;
			}
		}
	}
	return 0;
}
发布了107 篇原创文章 · 获赞 3 · 访问量 7116

猜你喜欢

转载自blog.csdn.net/qq_43504141/article/details/104154518