Educational Codeforces Round 138 (Rated for Div. 2)

写在前面:没打,在补。

CF1749 (div 2)

A. Cowardly Rooks

简要题意:

\(n \times n\)的国际象棋棋盘,有\(m\)个车,问是否能移动一个车,使得

  1. 没有两个车在同一格子里
  2. 没有两个车能互相攻击

车能攻击一行或一列。\(1 \leq n,m \leq 8\)

保证给定的\(m\)个车满足1,2条件。


因为保证了输入的车一开始满足条件,所以只有当没有空行和空列时,才无法找到移动一个车后仍然合法的方案。

所以\(n==m\) 输出\(NO\) 否则\(YES\)

\(code:\)

#include <bits/stdc++.h>

using namespace std;

inline void _main(){
	int n,m;
	cin>>n>>m;
	for(int i=1,x,y;i<=m;++i) cin>>x>>y;
	if(n==m) puts("NO");
	else puts("YES");
}

int main(){
	int t;
	cin>>t;
	while(t--) _main();
	return 0;
}

B. Death's Blessing

简要题意:
\(n\)只怪,打死一只怪需要\(a_i\)的时间,同时会给相邻怪的时间加上\(b_i\),问能把怪打完的最小时间。


不难发现,每次选择两边打其中一个打一定最优(不然你\(b_i\)会给两个人,同时所有\(a_i\)都会打完),\(b_i\)最大的那个数肯定最后打。

\(code:\)

#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2e5 + 5;

int n,a[MAX_N],b[MAX_N];

inline void _main(){
	cin>>n;
	long long ans=0;
	int mx=0;
	for(int i=1;i<=n;++i) cin>>a[i],ans+=a[i];
	for(int i=1;i<=n;++i) cin>>b[i],ans+=b[i],mx=max(mx,b[i]);
	ans-=mx;
	cout<<ans<<'\n';
}

int main(){
	int t;
	cin>>t;
	while(t--) _main();
	return 0;
}

C.Number Game

简要题意:

一个序列,\(Alice\)\(i\)次选择一个小于等于\(k-i+1\)的数删掉,\(Bob\)任意选择一个数删掉。

如果\(Alice\)无法删数,则输。

\(k\)轮结束后,若\(Alice\)没输,则赢。

求最大的\(k\)

\(1 \leq n \leq 100\)


不难发现,可以二分+check,但是数据范围不大,也可以直接暴力枚举+check

\(code:\)

#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100 + 5;

int n,a[MAX_N];

inline bool check(int x){
	int l=1,r=n;
	for(int i=1;i<=x;++i){
		if(i>1) l++;
		while(r>=l && a[r]>x-i+1) r--;
		if(l>r) return false;
		r--;
	}
	return true;
}

inline void _main(){
	cin>>n;
	for(int i=1;i<=n;++i) cin>>a[i];
	sort(a+1,a+1+n);
	int ans=0;
	for(int i=n;i;--i){
		if(check(i)){
			ans=i;
			break;
		}
	}
	cout<<ans<<'\n';
}

int main(){
	int t;
	cin>>t;
	while(t--) _main();
	return 0;
}

D. Counting Arrays

简要题意:

posted @ 2022-10-23 19:12  Thermalrays  阅读(28)  评论(1编辑  收藏  举报