# Prefix Sum# Brute Force# Greedy

b310(Q) - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出一個數列中,滿足子數列和至少為 b 的最短長度。如果找不到任何子數列滿足條件,則輸出 "GGGGGZ"。

解題思路

首先,計算數列的前綴和,以便快速計算任意子數列的和。然後,使用兩層迴圈遍歷所有可能的子數列,計算每個子數列的和,並檢查是否大於等於 b。如果找到滿足條件的子數列,則更新最短長度。如果遍歷完所有子數列後仍然沒有找到滿足條件的子數列,則輸出 "GGGGGZ"。如果前綴和的第一個元素就大於等於 b,則輸出 1。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(n)

程式碼

#include <stdio.h>
int main(){
	long long int a,b;
	while(scanf("%lld%lld",&a,&b)>0){
		long long int sum[a];
		for(int i=0;i<a;++i){
			scanf("%lld",&sum[i]);
			(i)?sum[i]+=sum[i-1]:1;
		}
		if(sum[a-1]<b)
			printf("GGGGGZ\n");
		else{
			long long int ans=a+1;
			if(sum[0]>=b)
				printf("1\n");
			else{
				for(int i=0,z=1;i<a;++i,z=1){
					for(int j=i+1;j<a;++j,++z){
						if(sum[j]-sum[i]>=b){
							if(z<ans)
								ans=z;
							break;
						}
					}
				}
				printf("%lld\n",ans);
			}
		}
	}
}

Discussion