考试地点位于中山市纪念中学旧科学馆304教室的1号座位。考试开始后,发现键盘操作不流畅,但因题目难度而忽略。T1题目风格与预期一致,采用离散化排序+双指针策略快速通过样例。
进入T2环节时,因前期练习过类似题目产生误判,误以为两问独立评分。在完成第一问后尝试切入T3,却发现题目要求整体评分。此时原计划被打乱,经过权衡后选择继续完善T2代码。由于急于求成导致调试时间延长,最终在考前半小时通过样例,但因边界条件错误损失30分。
T3部分因时间不足仅实现基础框架,赛后通过重新分析发现正确解法。最终成绩150分(100+30+20+0),对CCF数据宽容度表示感谢。
### 代码示例
T1优化版
#include<bits/stdc++.h>
using namespace std;
const int MAX=2e5+10;
int main(){
freopen("duel.in","r",stdin);
freopen("duel.out","w",stdout);
int n; cin>>n;
vector<int> values(n);
for(auto &v:values) cin>>v;
vector<int> sortedValues = values;
sort(sortedValues.begin(), sortedValues.end());
sortedValues.erase(unique(sortedValues.begin(), sortedValues.end()), sortedValues.end());
vector<int> index(n);
for(int i=0; in) break;
}
++i; ++j;
}
cout<
T2改进版
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=1e5+10;
struct Vehicle{
double start, end;
int coverCount;
};
int T, n, m, L, V;
Vehicle vehicles[MAXN];
vector<int> points[MAXN];
void solve(){
cin>>n>>m>>L>>V;
for(int i=1; i<=n; ++i){
points[i].clear();
vehicles[i] = {0, 0, 0};
}
for(int i=1; i<=n; ++i){
cin>>vehicles[i].start>>vehicles[i].end>>vehicles[i].coverCount;
if(vehicles[i].coverCount == 0){
if(vehicles[i].end > V)
vehicles[i].start = vehicles[i].end;
} else {
double s = vehicles[i].start + (V*V - vehicles[i].end*vehicles[i].end)/(2.0*vehicles[i].coverCount);
if(vehicles[i].coverCount < 0)
vehicles[i].start = vehicles[i].start, vehicles[i].end = s;
else
vehicles[i].start = s, vehicles[i].end = L;
}
}
for(int i=1; i<=m; ++i) cin>>points[i];
int total=0;
for(int i=1; i<=n; ++i){
bool flag=false;
for(int j=1; j<=m; ++j){
if(vehicles[i].start == 0 && vehicles[i].end == 0) continue;
if(points[j] >= vehicles[i].start-0.00001 && points[j] <= vehicles[i].end+0.00001){
if(!flag) total++;
points[j].push_back(i);
flag=true;
vehicles[i].coverCount++;
}
}
}
int res=0;
for(int i=1; i<=m; ++i){
bool valid=true;
for(int j: points[i]){
if(vehicles[j].coverCount == 1) {
valid=false; break;
}
}
if(valid){
for(int j: points[i]) vehicles[j].coverCount--;
res++;
}
}
cout<>T;
while(T--) solve();
return 0;
}
T3优化版
#include<bits/stdc++.h>
using namespace std;
const int MAXN=20;
int T, n, ans;
int a[MAXN], b[MAXN];
void solve(){
cin>>n;
for(int i=1; i<=n; ++i) cin>>a[i];
ans=0;
for(int i=0; i<(1<>(j-1))&1;
int red=0, blue=0, score=0;
for(int j=1; j<=n; ++j){
if(red && b[j]==1 && a[j]==a[red]) score += a[j];
if(blue && b[j]==0 && a[j]==a[blue]) score += a[j];
if(b[j]==1) red=j;
else blue=j;
}
ans = max(ans, score);
}
cout<>T;
while(T--) solve();
return 0;
}
### 赛后反思
本次考试对个人意义重大,但未能达到预期目标。真正投入OI学习始于本暑假,感谢所有指导过我的人。希望后来者能避免相同失误。
### 补充代码
赛后优化的T3解法
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int T, n, a[MAXN];
long long f[MAXN], s[MAXN];
void solve(){
cin>>n;
for(int i=1; i<=n; ++i) cin>>a[i];
for(int i=2; i<=n; ++i){
s[i] = s[i-1] + (a[i]==a[i-1] ? a[i] : 0);
}
for(int i=2; i<=n; ++i){
f[i] = f[i-1];
if(a[i] == a[i-1]){
f[i] = max(f[i], f[i-2] + s[i] - s[i-1]);
}
}
cout<>T;
while(T--) solve();
return 0;
}