2026/10/1 CSP-S2024反思总结
总分:\(210/400\)分
\(T1:100\)分\(AC\)
一道贪心,看了10分钟的样例自己悟出来第一个贪心虽然是假的
- 把所有的数据存到
set里,不仅去重又排序,也把所有的数组存到hash里,记录一个cnt - 扫每一个元素然后把上一个干掉,剩下的加上
但是到了大样例的第二个就WA了,后来又想到不一定要用比他高的一个,所有比他高的都可以,然后发现只要记录cnt就好了,从战力高的到战力低的扫,如果可以干掉就干掉,多的高战力的数量存一下,最后输出就好了
01| #include<bits/stdc++.h>
02| #define int long long
03| using namespace std;
04| const int N=1e5+10;
05| int n;
06| int cnt[N];
07| signed main(){
08| cin>>n;
09| for(int i=1;i<=n;i++){
10| int x;cin>>x;
11| cnt[x]++;
12| }
13| int ans=0;
14| for(int i=N-10;i>=1;i--){
15| if(cnt[i]==0) continue;
16| ans+=cnt[i]-min(ans,cnt[i]);
17| }
18| cout<<ans<<endl;
19| return 0;
20| }
\(T2\):90分WA
这道题其实如果没有给加速度的提示我直接不会做,但这题简单就简单在它是公式的,直接通过公式可以得到是在什么地方得到的速度为\(V\)这样就可以得到所有的\([l,r]\)区间请一定注意你的特判,作者就是因为少了一个特判而90分的
- 第一个数就是问你有几个区间里至少有1个点被覆盖
sort(p+1,p+1+m);
for(auto x:cars){
int l=lower_bound(p+1,p+1+m,x.first)-p;
int r=upper_bound(p+1,p+1+m,x.second)-p-1;
if(l<=r){
ans1++;
seg.push_back(make_pair(l,r));
}
}
- 第二个在求至少需要几个点来使得所有的区间都要点覆盖
sort(seg.begin(),seg.end(),cmp);
int last=-1,ans2=m;
for(auto x:seg){
if(x.first<=last&&last<=x.second) continue;
ans2--,last=x.second;
}
\(T3\):\(20\)分WA+TLE
额,这题直接是想到了dp,其他啥也没想到,只打了\(\Theta (N2^N)\)的\(20\)分暴力,其实这题的dp状态想出来了之后还是比较好推的题解见此
\(T4\):\(0\)分WA
一道黑,不仅题看不懂,连输入都不太会输,直接放弃

浙公网安备 33010602011771号