【問題描述】
城市公交系統有一個記錄儀,用於記錄每個站點的乘客人數的變化情況,例如:x表示到站前公交車上的乘客人數,y表示離站時公交車上的乘客人數,則該記錄儀記錄的該站的數字爲y-x。
對於一輛公交車和n個車站,a1,a2,...,an爲該公交車在各站的記錄數據。
假定w爲該公交車可容納的最大乘客人數,編程求出在第一站停靠之前公交車上人數的可能數據有多少種?
【輸入形式】
第一行包含兩個數據n和w(1<=n<=1000, 1<=w<=109),分別表示車站的數目和公交車可容納的最大乘客人數。
第二行包含一個序列a1,a2,...,an,表示記錄儀記錄的各站的數據。
【輸出形式】
輸出一個整數,表示公交車在第一站停靠之前可能的乘客人數數據的個數,如果沒有,則輸出0。
【樣例輸入1】
3 5
2 1 -3
【樣例輸出1】
3
【樣例輸入2】
2 4
-1 1
【樣例輸出2】
4
【樣例輸入3】
4 10
2 4 1 2
【樣例輸出3】
2
【樣例說明】
在第一個樣例中,乘客數可能有0、1、2,共3種情況
在第二個樣例中,乘客數可能有1、2、3、4,共4種情況
在第三個樣例種,乘客數可能爲0或1,共2種情況
#include<iostream>
using namespace std;
int main()
{
int n;cin>>n;
int w;cin>>w;
int a[n];
int stop[n+1]={0};
int step=1;
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=n-1;i>=0;i--)//a[n]
{
//i--,--i,i=i-1單獨沒有區別。真正的區別在於放到其它運算式中,若i=1
//stop[i--]等同於stop[1],i=0
//stop[--i]等同於stop[0],i=0
//stop[i-1]等同於stop[0],i=1
int z=step-1;//表達式中含有step-- e.g.stop[z],stop[step--]警惕++,--
stop[step]=stop[z]-a[i];
step++;
}
for(int i=0;i<step;i++)
{
for(int j=i+1;j<step;j++)
{
if(stop[j]>stop[i])
{
int k=stop[i];
stop[i]=stop[j];
stop[j]=k;
}
}
}
for(int i=0;i<=w;i++)
{
if((i+stop[0])<=w&&(i+stop[step-1])>=0) cnt++;
}
cout<<cnt<<endl;
return 0;
}