Codeforces Round #698 (Div. 2)
阿新 • • 發佈:2021-01-30
技術標籤:題目
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 即可)
要是小於 d10,那麼分出來的數肯定都是最大兩位數,而且十位不是 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;
}