1. 程式人生 > 其它 >Codeforces Round #698 (Div. 2)

Codeforces Round #698 (Div. 2)

技術標籤:題目

A. Nezzar and Colorful Balls

http://codeforces.com/contest/1478/problem/A

#include <bits/stdc++.h>
using namespace std;
int T,n,f[200],a,ans=0;

int main()
{
	scanf("%d",&T);
	while (T--) {
		ans=0;
		memset(f,0,sizeof(f));
		scanf("%d",&n);
		for (int i=1; i<=n;
i++) { scanf("%d",&a); f[a]++; if (f[a]>ans) { ans=f[a]; } } printf("%d\n",ans); } return 0; }

B. Nezzar and Lucky Number

http://codeforces.com/contest/1478/problem/B
會發現要是大於等於 d10,那麼肯定是可以的。(先減一個數,它個位是 d,十位湊一湊讓剩下的數十位是 d 即可)
要是小於 d
10,那麼分出來的數肯定都是最大兩位數,而且十位不是 d,只有 個位是 d,判斷原數個位可否通過多個 d 湊出來即可。

注意:注意判斷會不會超過原數了。

#include <bits/stdc++.h>
using namespace std;
long long T,q,d,a,A,fail,tmp;

int main()
{
	scanf("%lld",&T);
	while (T--) {
		scanf("%lld%lld",&q,&d);
		while (q--) {
			scanf("%lld",&A);
			if (A>=d*10) {
				puts("YES"
); continue; } if (A%10==d || A/10==d) { puts("YES"); continue; } fail=1; for (int i=1; i<10; i++) { if (i*d>A) { //超了原數 break; } if (i*d%10 == A%10) { fail=0; break; } } puts(fail ? "NO" : "YES"); } } return 0; }

C. Nezzar and Symmetric Array

http://codeforces.com/contest/1478/problem/C
排個序,其實 d 的順序就是 a(絕對值) 的順序對應過去的。
那麼也就可以按順序求出對應的 a,要是求不出來或者出現重複,那麼就失敗,否則成功。

#include <bits/stdc++.h>
using namespace std;

long long T,n,d[300005],s,fail,N,lst;

int main()
{
	scanf("%lld",&T);
	while (T--) {
		scanf("%lld",&n);
		N=n<<1;
		for (long long i=1; i<=N; i++) {
			scanf("%lld",&d[i]);
		}
		sort(d+1,d+N+1);
		
		s=0;
		fail=0;
		lst=-1;
		
		for (long long i=N-2; i>0; i-=2) {
			if (d[i]==d[i+1]) {
				fail=1;
			}
		}
		
		for (long long i=N; i>0 && !fail; i-=2) {
			if (d[i]!=d[i-1]) {
				fail=1;
				break;
			}
			if ((d[i]-s)%(i)!=0 || (d[i]-s)<=0 || (lst==((d[i]-s)/(i)))) {
				fail=1;
				break;
			}
			lst=(d[i]-s)/(i);
			s+=(d[i]-s)/(i)*2;
		}
		
		puts(fail ? "NO" : "YES");
	}
	return 0;
}

D. Nezzar and Board

http://codeforces.com/contest/1478/problem/D
貝祖定理

#include <bits/stdc++.h>
using namespace std;
long long T,n,k,gg,a[200005];

long long my_gcd(long long b, long long c) {
	return c ? my_gcd(c,b%c) : b;
}

int main()
{	
	scanf("%lld",&T);
	while (T--) {
		scanf("%lld%lld",&n,&k);
		gg=0;
		for (int i=1; i<=n; i++) {
			scanf("%lld",&a[i]);
			gg|=(a[i]==k);
		}
		
		sort(a+1,a+n+1);
		long long tmp=a[2]-a[1];
		
		for (int i=3; i<=n; i++) {
			tmp=my_gcd(tmp,a[i]-a[i-1]);
		}
		
		gg|=((k-a[1])%tmp==0);
		puts(gg ? "YES" : "NO");
	}
	return 0;
}

E. Nezzar and Binary String

http://codeforces.com/contest/1478/problem/E
反過來做,從最終狀態往前驗,用線段樹區間修改區間查詢1的個數即可。


F. Nezzar and Nice Beatmap

http://codeforces.com/contest/1478/problem/F
思維題,實際上方案是肯定存在的。一種構造方法如下:
隨便選一個點為起點,之後每次選擇最長的那個點作為下一個點,直到全部點都被選完。
正確性:這樣每次選的其實是剩餘邊集中的最長邊,那麼它與其他邊組成的三角形中,含這個邊的角肯定是銳角了。

#include <bits/stdc++.h>
using namespace std;
long long n,X[5005],Y[5005],tmp,tmpd,nowp;
bool f[5005];

long long dis(int x, int y)
{
	return (X[x]-X[y])*(X[x]-X[y])+(Y[x]-Y[y])*(Y[x]-Y[y]);
}

int main()
{
	scanf("%lld",&n);
	for (int i=1; i<=n; i++) {
		scanf("%lld%lld",&X[i],&Y[i]);
	}
	
	f[1]=nowp=1;
	printf("1 ");
	for (int i=2; i<=n; i++) {
		tmp=nowp;
		tmpd=-1;
		for (int j=1; j<=n; j++) {
			if (!f[j] && dis(nowp,j)>tmpd) {
				tmp=j;
				tmpd=dis(nowp,tmp);
			}
		}
		f[tmp]=1;
		printf("%lld ",tmp);
		nowp=tmp;
	}
	
	return 0;
}