Codeforces Round 1002 (Div. 2,A-C)

想了一下,我觉得个人赛的一个基本流程大致是这样的

  1. 认真的读一遍题,如果有,一定要看样例的解释,最后模拟样例
  2. 从问题的性质出发,包括但不限于复杂度,题目与数据的限制,重新读题,将问题转化为子问题。如果一个hint都没有,建议重复步骤1,如果卡这超过10分钟,建议切题
  3. 给出相应的解决方法,一定要思考可做性,可以参考过题人数与速度,同时思考一下代码的实现难易程度,在这里卡超过10分钟,也建议重新读题/切题

A

GuessForces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void solve(){
int n;cin>>n;
vector<int>a(n),b(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end());
set<int>st;
vector<int>v1,v2;
for(int i=0;i<n;i++){
if(!st.count(a[i]+b[i])) st.insert(a[i]+b[i]);
else{
v1.push_back(a[i]);
v2.push_back(b[i]);
}
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end(),greater<int>());
for(int i=0;i<v1.size();i++){
st.insert(v1[i]+v2[i]);
}
cout<<(st.size()>=3?"YES\n":"NO\n");
}

B

贪心的想,越长的串出现非i数一定越多

如果恰好填满(即k==n),只能按部就班的模拟

否则我们使得前2个子数组尽可能长(即让后k-2个子数组每个只包含一个数字),遍历前[2,n-(k-2)]的数组,容易发现一旦a[i]!=1,我们就将其作为第二段子数组的起点,此时答案为1

否则只能是该段数组都只包含1,此时将a[1]作为第一段子数组,第二段子数组将包含>1个数的1(因为此时n>k),此时答案为2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void solve(){
int n,k,cnt=1;cin>>n>>k;
vector<int>a(n+1),st;
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(k==n){
for(int i=1;i<=n;i++){
if(i%2==0) st.push_back(a[i]);
}
st.push_back(0);
for(auto i:st){
if(i!=cnt){
cout<<cnt<<"\n";
return;
}
cnt++;
}
}
for(int i=2;i<=n-(k-2);i++){
if(a[i]!=1){
cout<<1<<"\n";
return;
}
}
cout<<2<<"\n";
}

Welcome to my other publishing channels

Powered By Valine
v1.5.2