Educational Codeforces Round 138 (Rated for Div. 2)
写在前面:没打,在补。
CF1749 (div 2)
A. Cowardly Rooks
简要题意:
\(n \times n\)的国际象棋棋盘,有\(m\)个车,问是否能移动一个车,使得
- 没有两个车在同一格子里
- 没有两个车能互相攻击
车能攻击一行或一列。\(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
简要题意: