AtCoder Beginner Contest 216 题解

比赛地址:https://atcoder.jp/contests/abc216

只有 ABCDEF 的题解,G 待补,H 不会。

A

模拟。

void mian(){
	int x,y;
	scanf("%d.%d",&x,&y);
	if(0<=y&&y<=2)printf("%d-",x);
	if(3<=y&&y<=6)printf("%d",x);
	if(7<=y&&y<=9)printf("%d+",x);
	puts("");
}

B

模拟。

const int N=1000;

std::string s[N+10],t[N+10];
int n;

void mian(){
	std::cin>>n;
	for(int i=1;i<=n;i++)
		std::cin>>s[i]>>t[i];
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if(s[i]==s[j]&&t[i]==t[j]){
				puts("Yes");
				return;
			}
	puts("No");
}

C

考虑遍历 \(n\) 的每一个二进制位,如果是 \(1\),就 \(\times 2\),\(+1\),如果是 \(0\),就 \(\times 2\)。

ll n;

void mian(){
	scanf("%lld",&n);
	for(int i=59;i>=0;i--)
		if((n>>i)&1LL)printf("BA");
		else printf("B");
	puts("");
}

D

如果某一堆中 \(x\) 在 \(y\) 上面但是另一堆中 \(y\) 在 \(x\) 上面,那么就不行。

以此类推,可以得到一个结论:把这些 \(\langle x,y\rangle\) 的关系连有向边,如果存在环就不行,否则就行。

const int N=2e5;

struct Edge{int to,nxt;}e[N*2+10];int head[N+10],tote=1;
inline void addEdge(int u,int v){e[++tote].to=v;e[tote].nxt=head[u];head[u]=tote;}

int n,m,ind[N+10];

bool topoSort(){
	std::queue<int> q;
	for(int i=1;i<=n;i++)
		if(!ind[i])q.push(i);
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(--ind[v]==0)q.push(v);
		}
	}
	for(int i=1;i<=n;i++)
		if(ind[i])return 0;
	return 1;
}

void mian(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int k,x,lst=-1;
		scanf("%d",&k);
		for(int j=1;j<=k;j++){
			scanf("%d",&x);
			if(lst==-1)lst=x;
			else addEdge(lst,x),ind[x]++;
		}
	}
	puts(topoSort()?"Yes":"No");
}
上一篇:AtCoder Beginner Contest 182 题解


下一篇:AtCoder Beginner Contest 220