Codeforces Round #618 (Div. 2) 题解报告

传送门

A Non-zero

题解:要使得数组中所有乘积和和为 0 0 0,首先所有的 0 0 0必须要加上 1 1 1,之后再特判下此时的和是否为 0 0 0

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e2+5;
int n,h[N];
int main()
{
    
    
    rush(){
    
    
		sc(n);
		int add=0,ling=0;
		rep(i,1,n){
    
    
			sc(h[i]);
			if(h[i]==0)ling++;
			add+=h[i];
		}
		int ans=ling;
		add+=ling;
		if(add==0)ans++;
		pf(ans);
	}
    return 0;
}

B Assigning to Classes

题解:排序,两中位数相减即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=2e5+5;
int n,a[N];
int main()
{
    
    
    rush(){
    
    
		sc(n);
		n*=2;
		rep(i,1,n)sc(a[i]);
		sort(a+1,a+n+1);
		pf(a[n/2+1]-a[n/2]);
	}
    return 0;
}

C Anu Has a Function

题解:仔细观察发现规律,先将其都作为二进制看下,发现这个函数的功能就是将 y y y的二进制为 1 1 1的位统一给去除掉,然后就能得到要使得最后的数最大,那么就将哪个数上二进制表示该位为 1 1 1,且在所有数中只出现了一次,那么就把它放到前面即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e5+5;
int n,a[N],f[N][50],cnt[50];
void chu(int x,int i)
{
    
    
	int tot=0;
	while(x){
    
    
		if(x%2==1)cnt[tot]++;
		f[i][tot++]=x%2;
		x/=2;
	}
}
struct data{
    
    
	int val,flag;
}datas[N];
bool cmp(data a,data b)
{
    
    
	if(a.flag!=b.flag)return a.flag>b.flag;
	else return a.val>b.val;
}
int main()
{
    
    
    sc(n);
	rep(i,1,n)sc(a[i]),chu(a[i],i);
	rep(i,1,n){
    
    
		int flag=0;
		rep(j,0,32){
    
    
			if(f[i][j]==1&&cnt[j]==1){
    
    
				flag=j+1;
			}
		}
		datas[i]={
    
    a[i],flag};
	}
	sort(datas+1,datas+n+1,cmp);
	rep(i,1,n-1)p_f(datas[i].val);
	pf(datas[n].val);
    return 0;
}

D Aerodynamic

题解:这个题盲猜了一下,觉得只要一个图形每一条边都必须有一个平行边,可能也就是中心对称图形即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e5+5;
int n;
pii dots[N];
map<pii,int>m;
int main()
{
    
    
    sc(n);
	rep(i,0,n-1)sc2(dots[i].fi,dots[i].se);
	rep(i,0,n-1){
    
    
		int x=(dots[(i+1)%n].fi-dots[i].fi),y=(dots[(i+1)%n].se-dots[i].se);
		m[{
    
    x,y}]++;
	}
	bool flag=true;
	rep(i,0,n-1){
    
    
		int x=(dots[(i+1)%n].fi-dots[i].fi),y=(dots[(i+1)%n].se-dots[i].se);
		if(!m[{
    
    -x,-y}]){
    
    
			flag=false;
			break;
		}
	}
	if(flag)puts("YES");
	else puts("NO");
    return 0;
}

E Water Balance

题解:这个题可以发现的是只要存在逆序的关系,那么我们就可以一直使用题中的那个功能,为了达到时间符合,可以从左到右扫描一遍,时间复杂度也就是 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e6+5;
int n,len[N];
db a[N],st[N];
int main()
{
    
    
    sc(n);
	rep(i,1,n)scanf("%lf",&a[i]),a[i]=a[i]*1.0;
	int tot=0;
	rep(i,1,n){
    
    
		st[++tot]=a[i];
		len[tot]=1;
		while(tot>1&&st[tot-1]>st[tot]){
    
    
			st[tot-1]=(st[tot-1]*len[tot-1]+st[tot]*len[tot])/(len[tot-1]+len[tot]);
			len[tot-1]+=len[tot];
			tot--;
		}
	}
	rep(i,1,tot)rep(j,1,len[i])printf("%.10f\n",st[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/104249631