Description
Farmer John has completely forgotten how many cows he owns! He is too embarrassed to go to his fields to count the cows, since he doesn't want the cows to realize his mental lapse. Instead, he decides to count his cows secretly by planting microphones in the fields in which his cows tend to gather, figuring that he can determine the number of cows from the total volume of all the mooing he hears.
FJ's N fields (1 <= N <= 100) are all arranged in a line along a long straight road. Each field might contain several types of cows; FJ owns cows that come from B different breeds (1 <= B <= 20), and a cow of breed i moos at a volume of V(i) (1 <= V(i) <= 100). Moreover, there is a strong wind blowing down the road, which carries the sound of mooing in one direction from left to right: if the volume of mooing in some field is X, then in the next field this will contribute X-1 to the total mooing volume (and X-2 in the field after that, etc.). Otherwise stated, the mooing volume in a field is the sum of the contribution due to cows in that field, plus X-1, where X is the total mooing volume in the preceding field.
Given the volume of mooing that FJ records in each field, please compute the minimum possible number of cows FJ might own.
The volume FJ records in any field is at most 100,000.
约翰忘记了他到底有多少头牛,他希望通过收集牛叫声的音量来计算牛的数量。
他的N (1 <= N <= 100)个农场分布在一条直线上,每个农场可能包含B (1 <= B <= 20)个品种的牛,一头品种i的牛的音量是V(i) ,(1 <= V(i) <= 100)。一阵大风将牛的叫声从左往右传递,如果某个农场的总音量是X,那么将传递X-1的音量到右边的下一个农场。另外,一个农场的总音量等于该农场的牛产生的音量加上从上一个农场传递过来的音量(即X-1)。任意一个农场的总音量不超过100000。
请计算出最少可能的牛的数量。
Input
Line 1: The integers N and B.
Lines 2..1+B: Line i+1 contains the integer V(i).
Lines 2+B..1+B+N: Line 1+B+i contains the total volume of all mooing in field i.
Output
- Line 1: The minimum number of cows owned by FJ, or -1 if there is no configuration of cows consistent with the input.
Sample Input
5 2
5
7
0
17
16
20
19
Sample Output
4
Hint
INPUT DETAILS:
FJ owns 5 fields, with mooing volumes 0,17,16,20,19. There are two breeds of cows; the first moos at a volume of 5, and the other at a volume of 7.
OUTPUT DETAILS:
There are 2 cows of breed #1 and 1 cow of breed #2 in field 2, and there is another cow of breed #1 in field 4.
题解
\(PS\):
- 本想找个\(RMQ\)练手,却遇到了一道裸裸的完全背包
我们可以通过每一个农场的总音量还原出该农场的牛产生的音量
题目要我们求的是最小奶牛数,很显然,具有最优子结构的性质,即我们只有让每一个农场的奶牛数最少,总奶牛数一定就是最小值
已知每一种奶牛的声音和每一个农场的总声音,求每个农场的最小奶牛数,题目中没有限定每种奶牛的数量,相信诸位一定能看出这就是一个完全背包
这样就诞生了我的代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=101,M=100001;
int n,b,m,f[M],w[N],v[N];
int main()
{
scanf("%d%d",&n,&b);
for(int i=1;i<=b;++i) scanf("%d",&w[i]);
for(int i=1;i<=n;++i) scanf("%d",&v[i]);
for(int i=n;i>1;--i)
if(v[i-1]) v[i]-=v[i-1]-1;//倒序还原每一个农场的牛产生的音量,正序的话会覆盖,注意我的特判
for(int i=1;i<=n;++i) m=max(m,v[i]);
for(int i=1;i<=m;++i) f[i]=1e+7;
for(int i=1;i<=b;++i)
for(int j=w[i];j<=m;++j)
f[j]=min(f[j],f[j-w[i]]+1);//完全背包
int Ans=0;
for(int i=1;i<=n;++i)
if(f[i]<1e+7) Ans+=f[v[i]];
else {puts("-1");return 0;}//无法用奶牛构成这种声音
printf("%d\n",Ans);
return 0;
}