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. 第一个数就是问你有几个区间里至少有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));
		}
	}
  1. 第二个在求至少需要几个点来使得所有的区间都要点覆盖
    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
一道黑,不仅题看不懂,连输入都不太会输,直接放弃

posted @ 2026-10-01 20:26  ThomasHang  阅读(9)  评论(0)    收藏  举报