Codeforces Round #514 (Div. 2)

题目链接:Codeforces Round #514 (Div. 2)


A:暴力找每个间隔能休息几次。注意首尾。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
int res,n,L,a,t[N],l[N];
signed main(){
	cin>>n>>L>>a;
	for(int i=1;i<=n;i++)	cin>>t[i]>>l[i];
	for(int i=1;i<=n;i++){
		res+=(t[i]-t[i-1]-l[i-1])/a;
	}
	res+=(L-t[n]-l[n])/a;
	cout<<res;
	return 0;
}

B:枚举每个点,能涂就涂,最后判断是不是一样即可。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e3+10;
const int dx[]={0,1,1,1,0,-1,-1,-1},dy[]={1,1,0,-1,-1,-1,0,1};
int n,m,flag;	char a[N][N],b[N][N];
inline int check(int x,int y){
	for(int k=0;k<8;k++)	if(a[x+dx[k]][y+dy[k]]!='#')	return 0;
	return 1;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)	scanf("%s",a[i]+1);
	for(int i=2;i<n;i++){
		for(int j=2;j<m;j++)	if(check(i,j)){
			for(int k=0;k<8;k++)	b[i+dx[k]][j+dy[k]]='#';
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)	if(a[i][j]=='#'&&b[i][j]!='#')	flag=1;
	}
	puts(flag?"NO":"YES");
	return 0;
}

C:删掉的数字为,先删奇数,然后2的倍数非4的倍数,然后4的倍数非8的倍数。

注意只有三个数字的情况。一定是 k k 3*k。

删数字可以set当中实现。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
int n,k=1;	set<int> s;
signed main(){
	cin>>n;
	if(n<4){
		for(int i=1;i<n;i++)	printf("1 ");	printf("%d\n",n);	return 0;
	}
	for(int i=1;i<=n;i++)	s.insert(i);
	while(n>0){
		vector<int> v;
		if(n==3){printf("%d %d %d\n",k,k,k*3);	return 0;}
		for(auto x:s){
			if(__gcd(x,k<<1)==k)	v.push_back(x);
		}
		for(int i=0;i<v.size();i++)	s.erase(v[i]),printf("%d ",k);
		n-=v.size();	k<<=1;
	}
	return 0;
}

D:首先二分半径,然后我们可以发现可能的圆,构成了一条直线。然后对于每个点,我们可以找到一个区间,所以就是判断区间是否有交集。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
const double eps=1e-8;
long double x[N],y[N],l,r=1e18,mi=1e9,mx;	int n,cnt; set<int> s;
inline int check(double mid){
	long double cl=-1e18,cr=1e18;
	for(int i=1;i<=n;i++){
		if(y[i]>2*mid)	return 0;
		long double p=sqrt(2.0*y[i]*mid-y[i]*y[i]);
		long double ql=x[i]-p,qr=x[i]+p;
		cl=max(cl,ql),cr=min(qr,cr);
		if(cl>cr)	return 0;
	}
	return 1;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i],mi=min(mi,y[i]),mx=max(mx,y[i]);
		if(fabs(y[i])<eps)	cnt++;	s.insert((int)(x[i]));
		y[i]=fabs(y[i]);
	}	
	if((mx>0&&mi<0)||cnt>1)	return puts("-1"),0;
	if(s.size()==1){
		long double mx=-1e18;
		for(int i=1;i<=n;i++)	mx=max(mx,y[i]);
		return printf("%.10Lf\n",mx/2),0;
	}
	for(int i=1;i<=150;i++){
		long double mid=(l+r)/2;
		if(check(mid))	r=mid;
		else	l=mid;
	}
	printf("%.10Lf\n",l);
	return 0;
}

你可能感兴趣的:(Codeforces)