CF #618 div.2


閑來無事,打場CF,本人蒟蒻,考場A了前三道,第四有解答

正文

T1 Non-zero

是道水題。。。。

給你一個序列a。要求你輸出最少的操作次數使這個序列的累和與累乘都不為0;

一次操作指給\(a_i\)+1.

我們的想法是先給每個零的+1,檢查此時和是否為0,若為0,+1,否則直接輸出答案

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int Maxn=101; 
int t,n,s,a[Maxn],sum;
int main() {
//	freopen("a.in","r",stdin);
	t=read();
	while(t--){
		n=read();s=0;sum=0;
		for(int i=1;i<=n;i++){
			a[i]=read();
			sum+=a[i]; 
		}
		for(int i=1;i<=n;i++) if(a[i]==0) s++,sum++,a[i]++;//��֤ a[i]��Ϊ0 
		if(sum!=0) printf("%d\n",s);
		else printf("%d\n",s+1);
	}
	return 0;
}

我把快讀刪了。。。有-的

T2 Assigning to Classes

我們注意到,差值事實上是兩個數之差,而這兩個數都為子數組中的中位數,所以這兩個數\(a\),\(b\),不妨設\(a>b\) ,從而,\(a \ge p_{k+1}\),而\(b \le p_{k}\), 這是顯然的。

從而,最小值之差即為\(p_{k+1}-p_{k}\),這是可以取到的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn=2*1e5+111;
int t,a[Maxn],n;
int main() {
//	freopen("a.in","r",stdin);
	t=read();
	while(t--){
		n=read();
		for(int i=1;i<=2*n;i++) a[i]=read();
		sort(a+1,a+1+2*n);
		printf("%d\n",a[n+1]-a[n]);
	}
	return 0;
}

T3 Anu Has a Function

我們注意到 ,事實上對於\(f(i,j)<i\),從而進一步的討論,把每一個數分解為二進制,如果這些數而二進制的某位上1的個數超過1,則這一位的答案一定為0,所以我們只需要從最高位開始掃,掃到某一位只有一個一即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn=1e5+111;
int r[50],a[Maxn],n;
bool s[Maxn][50]; 
int main() {
//	freopen("a.in","r",stdin);
	n=read();
	for(int i=1;i<=n;i++) {
		a[i]=read();
		int k=a[i];
		for(int j=0;k>0;j++){
			if(k&1) s[i][j]=1,r[j]++;
			k>>=1;
		}
	}
	int u=0;bool flag=1;
	for(int j=50;j>=0&&flag;j--)
		if(r[j]==1)
			for(int i=1;i<=n;i++)
				if(s[i][j]){
					u=i;
					flag=0;
					break;
				}
	if(u!=0) printf("%d",a[u]);
	for(int i=1;i<=n;i++) if(i!=u) printf(" %d",a[i]);
	return 0;
}

T4 Aerodynamic

我們可以推出再若在\(P(x_0,y_0)\)中有兩點\((x_1,y_1)\),和\((0,0)\),則必有\(P(x_0-x_1,y_0-y_1)\) 包含兩點\((0,0)\),\((-x_1,-y_)\),從而我們可以得到T一定是中心對稱的,只要我們檢查P是否具有中心對稱性即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn=1e5+111;
double x[Maxn],y[Maxn];
int n;
int main() {
//	freopen("a.in","r",stdin);
	n=read();
	if(n&1){
		printf("No");
		return 0;
	}
	for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
	x[n+1]=(x[1]+x[n/2+1])/2;y[n+1]=(y[1]+y[n/2+1])/2;n/=2;
	for(int i=2;i<=n;i++)
		if(x[2*n+1]!=((x[i]+x[i+n])/2)||y[2*n+1]!=((y[i]+y[i+n])/2)){
			printf("No");
			return 0;
		}
	printf("YES");
	return 0;
}

蒟蒻終能變為神犇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM