タイトルの説明
授業の後、子羊たちは牧草地に行き、草を食べました。Yangcunが現在特徴的なデモYangcunを検査している間、指導者たちはYangcunの牧草地を見たいと思っています。
陽村の牧草地は絶え間なく分布しており、牧草地ごとに異なる数の羊が放牧されています。指導者たちは、いくつかの連続した牧草地を見たいと思っていましたが、T羊以外は見たくありませんでした。村の責任者は、指導者たちがヤンクンのスタイルをもっと見て、できるだけ多くの牧草地を訪れることを望んでいました。
さて、村長が牧草地のどのセクションをリーダーがリーダーと村長の要件を満たすために訪問するかを決めるのを手伝ってください。
入力
最初の行には整数NとTがあり、Yangcunにある連続する牧草地の数を示し、リーダーは羊の最大数を確認したいと考えています。
2行目には、N個の整数があり、2つの整数の間のスペースで区切られています。i番目の番号aiは、i番目の牧草地でaiの羊が草を食べていることを意味します。番号の範囲は1〜Nです。
アウトプット
2つの数値の行が出力され、訪問の開始ポイント番号と終了ポイント番号がスペースで区切られて示されます。移動の方向は常に小さい数から大きい数です。また、同じ長さの可能性がある場合は、開始番号が小さい方の回答を出力します。データは、少なくとも回答が存在することを保証します。
入力例
5 10
6 3 2 1 7
出力例
2 4
データ範囲の制限
データの30%,. 1 <= N <= 100;
データの60%,. 1 <= N <= 1000;
データの100%,. 1 <= N <= 100000、0 <= AI <= 10 。9、0 < = T <= 2 31 -1。
プロンプト
10以下の連続の合計数を満たすには、3 + 2 + 1と2 + 1 + 7の2つの可能性があり、優先出力は2〜4の牧草地です。
分析
最初に70ptsメソッドについて話しましょう。直接接頭辞とそれに続く二重ループが各間隔を列挙し、次に比較します。
コード:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,a[100010],t,mx,mi,mj;
int main()
{
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
scanf("%d%d",&n,&t);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=a[i-1]+a[i];
}
for(register int i=1;i<=n-1;i++)
{
for(register int j=n;j>=i+1;j--)
{
if(a[j]-a[i-1]<=t)
{
if(j-i+1>mx)
{
mx=j-i+1;
mi=i;
mj=j;
break;
}
}
}
if(n-i<=mj-mi) break;
}
printf("%d %d",mi,mj);
fclose(stdin);
fclose(stdout);
return 0;
}
肯定的な解決策:
この問題の本質は、重みがt以下の最も長い連続シーケンスです。
接頭辞の合計と同様の方法を使用して、タスクを完了するための最適化を少し追加します。
コードオン
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,j,x,y,sum,a[100100];
int main()
{
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
cin>>n>>m;
int j=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
while(sum>m)//保证当前草场可以参观
{
sum-=a[j++];
}
if(i-j+1>y-x+1)
{
x=j;
y=i;
}
}
cout<<x<<' '<<y;
}