Div4 VP总结
1.Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)2.(区间覆盖问题)P5019 [NOIP2018 提高组] 铺设道路和Educational Codeforces Round 158 (Rated for Div. 2)3.Codeforces Round 922 (Div. 2)赛后总结4.Codeforces Round 923 (Div. 3)赛后总结5.Codeforces Round 913 (Div. 3)B(预处理)6.Codeforces Round 928 (Div. 4)赛后总结7.Codeforces Round 933 (Div. 3)赛后总结
8.Div4 VP总结
Codeforces Round 799 (Div. 4)
E(最长子区间)
基本思路
求满足s的最长子区间。
错误思路分析
- 想用双指针左右贪心模拟题目要求删前或后的数(但在面对前后两个相等的时候,删前删后没有无后效性)
- 简单暴力枚举子区间长度(显然在n=1e5的时候t了)
正确思路
- 虽然也是暴力枚举子区间,但有做优化。
先从左到右求和至题目要求s,记录长度,再把左端点有1的数删一个,右端点再去取下一个有1的数的位置。代码如下
void solve() { std::cin>>n>>m; std::vector<int>a(n); int sum=0; for(int i=0;i<n;i++){ std::cin>>a[i]; sum+=a[i]; } int ans=n; int cur=0;//cur就是求的区间和 if(sum<m){ std::cout<<-1<<"\n"; }else{ for(int i=0,j=0;i<n;i++){//这里我个人感觉很妙,用i,j两个指针实现了o(n)的时间复杂度。 while(j<n&&cur+a[j]<=m){ cur+=a[j]; j++; } if(cur==m){ ans=std::min(ans,n-(j-i)); } cur-=a[i]; } std::cout<<ans<<"\n"; }
}
```
F(有思路的暴力枚举)
题目大意
对一堆数是否能去三个独立的数相加使其总和尾数为3.
思路
直接用
代码
void solve() {
int n;
std::cin>>n;
std::vector<int >a(n+1),one(10);//one数组来记录原来数的尾数的次数
for (int i = 0; i < n; i++)
{
std::cin>>a[i];
a[i]%=10;
one[a[i]]++;
}
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
if((i+j+k)%10==3){
one[i]--;
one[j]--;
one[k]--;
if(one[i]>=0&&one[j]>=0&&one[k]>=0){
std::cout<<"YES"<<"\n";
return;
}
one[i]++;
one[j]++;
one[k]++;
}
}
}
}
std::cout<<"NO"<<"\n";
}
Codeforces Round 817 (Div. 4)
E(二维前缀和求和)
题目意思很明显二维前缀和。
代码
Codeforces Round 806 (Div. 4)
D(字符串切割问题)
- 错误思路
想着暴力对其他字符串枚举(首先时间会t,字符串前后相加的结果是不同的)。 - 正确思路
字符串切割加匹配问题基本需要用map做匹配,后面枚举各个位置切割是否在map中出翔过再做判断。
代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?