一,激光导弹例题讲解
1,例题
![](https://i-blog.csdnimg.cn/blog_migrate/6ea8ce4439bf7d774fe04d738806f001.png)
2,需要运用知识
![](https://i-blog.csdnimg.cn/blog_migrate/12bccb6895e74a722c9ff2b6b10cba56.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36a7fc8b4d36de802b19e7c8ea17c0c7.png)
3,基本思路
先通过二维前缀和获取每个点的价值,在通过二维的固定滑动窗口,从头到尾滑动遍历找到该窗口所能够囊括的最大价值位置。
4,代码实现
#include<iostream>
using namespace std;
int book[5005][5005]={0};//储存每个点价值的记录表
int main()
{
int n,m,x,y,v,MAX=0;//MAX即找到的最大价值
cin>>n>>m;
for(int i=0;i<n;++i)//获取数据
{
cin>>x>>y>>v;
book[x+1][y+1]+=v;
}
for(int i=1;i<5005;++i)//通过二维前缀和获取每个点的价值
for(int j=1;j<5005;++j)
book[i][j]=book[i-1][j]+book[i][j-1]-book[i-1][j-1]+book[i][j];
for(int i=m;i<=5005;++i)
for(int j=m;j<5005;++j)//通过滑动窗口遍历找到最大价值
MAX=max(book[i][j]-book[i-m][j]-book[i][j-m]+book[i-m][j-m],MAX);
cout<<MAX;
return 0;
}
5,注意事项
(1) 记录表记录数据注意最好不要从0开始
(2) 设置数组最好只设置一个book数组,且设置为全局变量,注意不要开太大
二,最大连续和
1,题目
![](https://i-blog.csdnimg.cn/blog_migrate/970479e1688ab20fbcb381bc98956967.png)
2,运用知识
![](https://i-blog.csdnimg.cn/blog_migrate/1b9748ca1af1957fddf054174a143436.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b3dff77dca3e17819ba6783c933afb2e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/272f03f169fae4193d759c638304ee49.png)
3,实现思路
建立一个滑动窗口,进行滑动,每滑动一次,则进行以下三种步骤,
(1)循环判断窗口大小是否大于m,如果是,则将队头出队,如果不是,则退出循环
(2)循环判断窗口内的数据和是否小于0,如果是,则将队头出队,如果不是,则退出循环
(3)将滑到的数据入队并单个数据的最大值。
以上每一步均需更新数据和的最大值。
4,代码实现
#include<iostream>
#include<deque>
using namespace std;
int main()
{
int n,m,sum=0,MAX=0,tmp=0;
cin>>n>>m;
deque<int> d,que;
d.resize(n);
for(int i=0;i<n;++i) cin>>d[i];
tmp=d.front();
for(int i=0;i<n;++i)
{
//步骤一
while(!que.empty()&&i-m+1>que.front()) sum-=d[que.front()],que.pop_front();
if(que.size()<=m) MAX=max(MAX,sum);
//步骤二
while(!que.empty()&&sum<0) sum-=d[que.front()],que.pop_front();
if(que.size()<=m) MAX=max(MAX,sum);
//步骤三
que.push_back(i),sum+=d[que.back()],tmp=max(tmp,d[i]);
if(que.size()<=m) MAX=max(MAX,sum);
}
if(tmp>=0) cout<<MAX;
else cout<<tmp;
}
5,注意实现
(1)上文提到的三个步骤均需更新数据和的最大值。
(2)需要获取单个数据的最大值,因为可能测试样例中的数组数据均为负数
(3)tmp,即用于存储数据最大值,需要初始化为数组当中的任意元素,当然也可以是-INF
三,Equidistant Letters
1,例题
![](https://i-blog.csdnimg.cn/blog_migrate/adec17e780b942e042f5d0d64fde6689.png)
2,运用知识
无
3,实现思路
用一个book数组记录每个字母出现次数,然后将出现的字母打印出来,出现几个打印几个。
4,代码实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
int t;
cin>>t;
for(int a=0;a<t;++a)
{
int book[26]={0};
string str;
cin>>str;
for(int j=0;j<str.size();++j)
++book[str[j]-'a'];//用一个book数组记录每个字母出现次数
for(int j=0;j<26;++j)
while(book[j]--!=0)
printf("%c",j+'a');//然后将出现的字母打印出来,出现几个打印几个
cout<<endl;
}
}
4,注意事项
无