很好奇月赛T2正解是啥
  • 板块学术版
  • 楼主Hisaishi_Kanade
  • 当前回复17
  • 已保存回复17
  • 发布时间2022/8/20 18:43
  • 上次更新2023/10/27 14:25:40
查看原帖
很好奇月赛T2正解是啥
575994
Hisaishi_Kanade楼主2022/8/20 18:43

Rt,本蒟蒻先写了个35pts的乱猜结论

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int n,i,m,x,cnt,ans,mid;
int a[1<<20|1];
int find(int *num,int x,int len)
{
	int l=0,r=len-1,mid,cnt=0,w;
	while(l<r)
	{
		cnt++;
		w=rand()%2;
		mid=(l+r+w)/2;
		if(num[mid]-w<x) l=mid+!w;
		else r=mid-w;
	}
	return cnt;
}
int main(){
	srand(time(NULL));
	scanf("%d",&n);
	for(i=0;i<n;++i)
		scanf("%d",a+i);
	scanf("%d",&m);
	while(m--)
		printf("%d\n",find(a,x,n));
	return 0;
}

然后愤愤然写了个3.7k的巨长代码

#include <time.h>
#include <stdlib.h>
int n,i,m,x,cnt,ans,mid,now;
int a[1<<20|1];
int find(int *num,int x,int len)
{
	int l=0,r=len-1,mid,cnt=0,w;
	while(l<r)
	{
		cnt++;
		w=rand()%2;
		mid=(l+r+w)/2;
		if(num[mid]-w<x) l=mid+!w;
		else r=mid-w;
	}
	return cnt;
}
int main(){
	scanf("%d",&n);
	for(i=0;i<n;++i)
		scanf("%d",a+i);
	scanf("%d",&m);
	while(m--){
		scanf("%d",&x);
		int ret=find(a,x,n);
		now=find(a,x,n);
		if(ret>now)
			ret=now;
//此处省略上千行
		now=find(a,x,n);
		if(ret>now)
			ret=now;
		printf("%d\n",ret);
	}
	return 0;
}

光荣得到六十。

然后我对于每次二分,对 w=1,0w=1,0 都进行运算,取较小值,复杂度应该问题不大,但是想知道正解是啥。。。

2022/8/20 18:43
加载中...