2020.04.08【NOIP普及组】模拟赛C组24

链接

T1:

有四种情况:
1.把2个1放在两个不同的区间
2.把2个1放在同一个区间
3.把2个1分别放在头和尾
4.之间输出

#include
#include
using namespace std;
int n,m,maxx1,maxx2,x,y,k=1000100;
char c;
int a[100100];
int main(){
	freopen("socdist.in","r",stdin);
	freopen("socdist.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c;
		if(c=='1'){
			m++;
			a[m]=i;
			if(m>1){
				k=min(k,a[m]-a[m-1]);
				if(a[m]-a[m-1]>=maxx1){
					maxx2=maxx1;
					maxx1=a[m]-a[m-1];
				}
				else maxx2=max(maxx2,a[m]-a[m-1]);
			}
		}
	}
	x=min(maxx1/2,maxx2/2);
	y=maxx1/3;
	if(a[1]>1){
		x=max(x,min(a[1]-1,maxx1/2));
		y=max(y,(a[1]-1)/2);
	}
	if(a[m]<n){
		x=max(x,min(n-a[m],maxx1/2));
		y=max(y,(n-a[m])/2);
	}
	int z=0;
	if(a[1]>1&&a[m]<n)z=min(a[1]-1,n-a[m]);
	if(m==0)cout<<n-1;
	else cout<<min(k,max(x,max(y,z)));
	return 0;
}

T2:

我们求出每个被感染的牛和它最近的被感染的牛的距离
爆力出奇迹

#include
#include
#include
using namespace std;
int m,n,k;
struct node{
	int x,y,z,flag;
}a[1001];
bool cmp(node x,node y){
	return x.x<y.x;
}
int main(){
	freopen("socdist2.in","r",stdin);
	freopen("socdist2.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
		a[i].z=10001001;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[i].y==1){
				a[j].z=min(a[j].z,a[i].x-a[j].x);
			}
			if(a[j].y==1){
				a[i].z=min(a[i].z,a[i].x-a[j].x);
			}
		}
	}
	int r=10010000,ans=0;
	for(int i=1;i<=n;i++){
		if(a[i].y==0)r=min(r,a[i].z-1);
	}
	for(int i=1;i<=n;i++){
		if(a[i].y==1){
			for(int j=i-1;j>=1;j--){
				if(a[i].x-a[j].x>r)break;
				if(a[j].flag){
					a[i].flag=1;
					break;
				}
			}
			if(a[i].flag==0){
				a[i].flag=1;
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}

T3:

loading……

你可能感兴趣的:(比赛,未完成)