蓝桥杯【算法赛】3.帕鲁服务器崩坏 题型:dp,前缀和

62 阅读1分钟

3.帕鲁服务器崩坏【算法赛】 - 蓝桥云课 (lanqiao.cn)

思想

需要考虑s[i]位置是'1',s[i+1]位置是'1'或'0'的情况

如果s[i+1]位置是'1'那么开启失败,否则开启成功

我刚开始这样写的,只能过80%的数据:

#include <iostream>
using namespace std;
const int N=2e5+10;
int sum[N];
int m,n;
string s;
int main()
{
  cin>>n;
  cin>>s;   
  cin>>m;
  s=" "+s;
  while(m--)
  {
    int cnt=0;
    int l,r;cin>>l>>r;
    for(int i=l;i<=r;i++)
    {
      if(s[i]=='1'&&s[i]!=s[i+1]&&i+1<=r)
      cnt++;
    }
    cout<<cnt<<endl;
  }
  return 0;
}

image.png

正解是前缀和dp解法

#include <iostream>
using namespace std;
const int N=2e5+10;
int sum[N];
int m,n;
string s;
int main()
{
  cin>>n;
  cin>>s;   
  cin>>m;
  s=" "+s;
  for(int i=1;i<=n;i++)
  {
    if(s[i]=='1'&&s[i+1]=='0') sum[i]=sum[i-1]+1;
    else sum[i]=sum[i-1];
  }

 
  while(m--)
  {
    int l,r;cin>>l>>r;
    cout<<sum[r-1]-sum[l-1]<<endl;
  } 
  return 0;
}

image.png