1932. 奶牛的聲音(mooomoo)

1932. 奶牛的聲音(mooomoo)

題目描述
農夫約翰最近忘記他有多少奶牛了!於是他決定用一個特別新穎的方法來計算奶牛的數量。他在每塊農田上都安裝一個麥克風,通過麥克風的音量來計算每個農田上有多少奶牛。
約翰的N個農田是排成一條直線,每個農田上可能擁有不同種類的奶牛,奶牛的種類是B種,第i種奶牛每隻奶牛都會發出Vi的音量。然後,由於農場裏是經常有風的,風的方向是從左到右的,風使得奶牛的聲音也從左到右吹了過去。如果聲音在某塊農田的音量是X,那麼接下來風將把X-1音量的聲音帶到下一個(右邊)那個農田上去。因此每塊農田上的音量等於本身這塊農田上奶牛發出的聲音加上左邊相鄰的農田音量X-1。
給定從左到右每塊農田上的音量,請幫助約翰計算他最少有多少數量的奶牛。

輸入
第一行兩個正整數N和B。
第2行到第B+1行,第i+1行的整數表示Vi。
第B+2行到第B+i+1行,表示從左到右每塊農田上的監測到的音量。

輸出
輸出最少可能有多少奶牛,如果不能確定的話,就輸出-1。

樣例輸入

5 2 
5 
7 
0 
17 
16 
20 
19

樣例輸出

4

數據範圍限制
1<=N<=100,1<=B<=20,1<=Vi<=100,每塊農田上監測的音量不超過100000。

提示
第一塊農田上音量爲0,所以奶牛數量也爲0,第二塊農田上音量爲17,由於左邊沒有聲音傳過來,所以17的音量全部是第二塊農田上奶牛產生的,第二塊農田上最少有2只第1種類的奶牛和1只第2種類的奶牛,接下來第三塊農田上的音量是16,全部由左邊傳過來,所以第三塊農田沒有奶牛,第四塊農田上音量是20,其中15是由第三塊農田上傳過來的,5是自己產生的,5的音量最少有1只第一種類的奶牛,所以最少總共有4只奶牛。

思路:完全揹包求方案總數

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
int n,b,w[50],f[1000000],ans,l,v;
int main()
{
	fre(mooomoo);
	memset(f,127/3,sizeof(f));
	scanf("%d%d",&n,&b);
	for(int i=1;i<=b;i++) scanf("%d",&w[i]);
	f[0]=0;
	for(int i=1;i<=b;i++)
	for(int j=w[i];j<=100000;j++)
		f[j]=min(f[j],f[j-w[i]]+1);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&v);
		if(l<=v&&(f[v-l]!=707406378)) ans+=f[v-l];
		else if(l<=v) {printf("-1\n");return 0;}
		l=(v-1>0?v-1:0);
	}
	printf("%d",ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章