首页 > 其他 > 详细

Atcoder ABC 190 赛后解题报告(暂A-D,后续会持续更新)

时间:2021-01-31 14:20:45      阅读:31      评论:0      收藏:0      [点我收藏+]

Atcoder ABC 190 赛后解题报告

A - Very Very Primitive Game /

首先理解题意,不是谁先吃完谁赢,而是谁先吃完,谁输。

然后就简单了,注意在 \(a=b\) 是要考虑谁是先手,先手必输。

//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!h>
#define int long long
using namespace std;

int read() {
	char ch=getchar();
	int f=1,x=0;
	while(ch<‘0‘||ch>‘9‘) {
		if(ch==‘-‘)
			f=-1;
		ch=getchar();
	}
	while(ch>=‘0‘&&ch<=‘9‘) {
		x=x*10+ch-‘0‘;
		ch=getchar();
	}
	return f*x;
}

int a,b,c;

signed main() {
	cin>>a>>b>>c;
	if(c==1) {
		if(a>=b) {
			printf("Takahashi\n");
		}
		else {
			printf("Aoki\n");
		}
	}
	else {
		if(a>b) {
			printf("Takahashi\n");
		}
		else {
			printf("Aoki\n");
		}
	}
	return 0;
}

B - Magic 3

这个题非常简单,对于每一组魔法,把 \(X_i,Y_i\)\(S,D\) 做大小比较即可,注意两者只要有一种不满足条件魔法就失效。

//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;

int read() {
	char ch=getchar();
	int f=1,x=0;
	while(ch<‘0‘||ch>‘9‘) {
		if(ch==‘-‘)
			f=-1;
		ch=getchar();
	}
	while(ch>=‘0‘&&ch<=‘9‘) {
		x=x*10+ch-‘0‘;
		ch=getchar();
	}
	return f*x;
}

const int maxn=1e3+10;

int n,x[maxn],y[maxn],s,d;

signed main() {
	bool flag=0;
	cin>>n>>s>>d;
	for(int i=1;i<=n;i++) {
		x[i]=read();
		y[i]=read();
		if(x[i]<s&&y[i]>d) {
			cout<<"Yes\n";//有一组成功即可。
			return 0;
		}
	}
	cout<<"No\n";//都不成功输出 NO

	return 0;
}

C - Bowls and Dishes

这个题一看 \(k\) 那么小,直接搜索即可,我们枚举第 \(i\) 个客人把球放在第 \(C_i\) 或者 \(D_i\) 个盘子上的时候满足的条件数,总共 \(2^k\) 种情况用搜索来枚举,最后写一个 calc 函数检查有多少条件被满足即可,取最大值。

时间复杂度 \(O(2^k\cdot m)\)

//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
//#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
//#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
using namespace std;

int read() {
	char ch=getchar();
	int f=1,x=0;
	while(ch<‘0‘||ch>‘9‘) {
		if(ch==‘-‘)
			f=-1;
		ch=getchar();
	}
	while(ch>=‘0‘&&ch<=‘9‘) {
		x=x*10+ch-‘0‘;
		ch=getchar();
	}
	return f*x;
}

const int maxn=1e2+10;

int n,m,k,a[maxn],b[maxn],ans,c[maxn],d[maxn],hv[maxn];
//hv 记录第 i 个盘子上有多少个球

int calc() {
	int ret=0;
	for(int i=1;i<=m;i++) {
		if(hv[a[i]]&&hv[b[i]]) {
			ret++;//满足条件
		}
	}
	return ret;
}

void dfs(int i) {
	if(i==k+1) {
		ans=max(ans,calc());
		return ;
	}
	
	hv[c[i]]++;
	dfs(i+1);
	hv[c[i]]--;//别忘了回溯
	hv[d[i]]++;
	dfs(i+1);
	hv[d[i]]--;
	return ;
}

signed main() {
	cin>>n>>m;
	for(int i=1;i<=m;i++) {
		a[i]=read();
		b[i]=read();
	}
	
	cin>>k;
	for(int i=1;i<=k;i++) {
		c[i]=read();
		d[i]=read();
	}
	
	dfs(1);
	cout<<ans<<endl;

	return 0;
}

D - Staircase Sequence

这是一道数学题。

我们首先可以分析一下样例,对于 \(N=12\) 时,有 \(4\) 组解。

  • \([12]\)
  • \([3,4,5]\)
  • \([?2,?1,0,1,2,3,4,5]\)
  • \([?11,?10,?9,\cdots,10,11,12]\)

我们发现,第 \(3\),第 \(4\) 组解的后缀和第 \(2\),第 \(1\) 组解完全相同。因此我们可以得出以下结论:

如果对于整数 \(N\),有一组解 \([x,x+1,x+2,\cdots,x+k]\)\(x>0\),那么一定还有一组解为 \([-(x-1),-(x-2),\cdots ,0,\cdots x-1,x,x+1\cdots,x+k]\),证明过于简单,这里不再赘述。

那么很明了了,我们只需要求出所有 \(x>0\) 的情况数即可,可是怎么求呢?

我们再从和为 \(N\) 这个条件出发想,如果有一组解有偶数个数,如:\([x-k,\cdots,x,x+1,\cdots,x+1+k]\),一定有 \((x+0.5)*(2k+2)=N\),同理,若有奇数个数,如 \([x-k,\cdots,x,\cdots,x+k]\),一定有 \(x*(2k+1)=N\)。证明略。

我们可以枚举某一组解的长度,确定 \(k\)\(x\),当 \(x-k\leq 0\) 时,枚举结束即可。可以证明,若序列长度为 \(l\),且 \(x-k>0\),一定有 \(2*l^2\leq N\),证明略。

前面提到的证明非常基础,若不能证明,建议补补数学。

//Don‘t act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you‘ll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;

signed main() {
	cin>>n;
	for(int i=1;i*i<=2*n;i++) {
        //这里可能和前面所说的变量名和判断方法不太一样
        //希望读者自行理解
		if(i&1&&n%i==0) {
			ans++;
		}
		if(i%2==0&&(n*2)%i==0&&n%i!=0) {
			ans++;
		}
	}
	cout<<ans*2<<endl;
	return 0;
}

记得开 long long

Atcoder ABC 190 赛后解题报告(暂A-D,后续会持续更新)

原文:https://www.cnblogs.com/huayucaiji/p/ABC190.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!