不够细心的失分--滑动窗口
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不够细心的失分--滑动窗口相关的知识,希望对你有一定的参考价值。
题目:报数游戏 == Bash博弈
关于基本的几个博弈问题,我这里给出某大佬的个人博客链接(非常详细).
各种博弈
题目:星星序列
解题思路及代码
人傻了,本来很快就写好了滑动窗口,然后看基本的样例过了也就没管了,谁知竟败在
long long
的数据范围上,本人提交的代码用的都是int
。。。
这次比赛的基本总结:
- 第一次参加这种ACM类型的oi赛事,原来测试样例只会给一个(所以自测是不行的)。
- 提交代码后你不会知道是否通过,所以可能会被数据范围卡死几十分而不自知。。。
说回滑动窗口
滑动窗口适用范围:
- 要求是连续的序列 && 题目中收缩窗口的界限分明
什么是滑动窗口:用
left
和right
指针控制子序列的边界,将其中的元素滑入名叫windows[]
的哈希表中,一般是根据表中元素个数的情况来进行收缩窗口判断(窗口收缩就是left
指针右移)
#include<bits/stdc++.h>
using namespace std;
int main(){
//基本的数据输入
int n,k;cin >> n>>k;
long long nums[n];
for(int i=0;i<n;i++){
cin >>nums[i];
}
//定义窗口
unordered_map<long long,int>windows;
//初始化左右指针
int l = 0,r=0;
int res = 0;
//开始滑窗
while(r<n){
//加入到窗口(该死的就错在longlong的数据上。。结果分数少一半)
long long & x = nums[r];
windows[x]++;
//开始收缩窗口
while(windows[x]>k&&l<r){
res = max(res,r-l);
//移出窗口
long long& s = nums[l++];
windows[s]--;
}
r++;
}
//边界处理,前面整段就是滑动窗口的基本模板,跟着代码想象左右指针滑动的感觉就行
res = max(res,r-l);
cout<<res;
return 0;
}
搞完这题建议看看这个:
某大佬的滑动窗口总结
题目:大小即数量
基本只要懂得hash表的使用,都能过,可惜。。。少考虑一种情况直接0分。。。当该数值的个数比本身的数值还要少,那就只好全删了😢
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin >> n;
vector<long long>nums(n);
unordered_map<long long,int>check;
for(int i=0; i<n ;i++){
cin >> nums[i];
check[nums[i]]++;
}
int res = 0;
for(auto t:check){
if(t.second>t.first)
res+=t.second-t.first;
if(t.second<t.first)
res+=t.second;
}
cout<<res<<endl;
return 0;
}
本次总结
不算基本失误的话,总共才AC了三道题。。。还是太菜了,其余都想当然的用dfs,结果加起来不到30分?
只能说测试用例写的太狠了(菜才是事实。。。)
由于平时刷oi题少,加上没打过蓝桥杯和acm,平时刷的是leetcode,都不知道基本的比赛规则了,测试用例一直输入测试一直错。。还以为这次总分要0分了。。。但不得不说还是喜欢刷leetcode,喜欢它独特的社区氛围🤣😊
以上是关于不够细心的失分--滑动窗口的主要内容,如果未能解决你的问题,请参考以下文章
我的片段中有 webview,当滑动 webview 时, viewPager 也开始滑动