題目描述
輸入描述:
第一行數據三個整數:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入獄時間給出每個犯人的罪行值ai(0≤ai≤1e9)
輸出描述:
一行輸出答案。
輸入例子:
3 100 2 1 2 3
輸出例子:2
#include <stdio.h> #include <string.h> #include <stdlib.h> int plus(int *in,int start,int end) { int sum=0; for(int i=start;i<end;i++) sum = sum+in[i]; return sum; } int main() { int n=0,t=0,c=0; int wayscount=0; int *crime; while(scanf("%d%d%d",&n,&t,&c) != EOF) { if(c<=n) { wayscount=0; sum=0; crime = (int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++) scanf("%d",&crime[i]); int start = 0; while(start+c<=n) { if(plus(crime,start,start+c)<t) start++; wayscount++; } printf("%d\n",wayscount); free(crime); } } return 0; }
這是我一開始的代碼,結果是運行時間過長,無法編譯通過。這就很尷尬了。我這裏都沒有很大量的循環。
這樣一來累加就只做一次,大大縮減了運行時間。我這裏爲了方便,就沒有將累加函數寫回main裏了。如果對時間要求很高,建議全寫在main裏,畢竟函數跳轉,變量壓棧,出棧這些也都是需要時間的。貼上改進後的代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int plus(int *in,int start,int end)
{
int sum=0;
for(int i=start;i<end;i++)
sum = sum+in[i];
return sum;
}
int main()
{
int n=0,t=0,c=0;
int wayscount=0;
int *crime;
int sum=0;
while(scanf("%d%d%d",&n,&t,&c) != EOF)
{
if(c<=n)
{
wayscount = 0;
sum = 0;
crime = (int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
scanf("%d",&crime[i]);
int start = 0;
sum = plus(crime,start,start+c);
if(sum<=t)
wayscount++;
for(int j=c;j<n;j++)
{
sum=sum-crime[j-c];
sum=sum+crime[j];
if(sum<=t) wayscount++;
}
printf("%d\n",wayscount);
free(crime);
}
}
return 0;
}