bzoj 3480 [Usaco2014 Mar]Mooo

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.

J有n块田,在一条直线上,田里有b种牛,每种牛的都有自己的叫声大小vi,由于有风,每块田可以听到的叫声大小为田里所有牛的叫声和加左边的叫声大小减一(最左边那块田的话,则只能听到自己田地里的声音),给定每种牛的叫声大小已及每块田所听到的声音,求最小可能存在多少头牛,没有解输出-1

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

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.

Sample Output

4
至少存在四头牛,其中有三头在第二块田地(二头第一种类的,一头第二种类的),一头在第四块田地(其为第一种类)

dp预处理出音量i最少需要几头牛,算出每个田地的实际音量,累加即可

#include<cstdio>
#include<iostream>
using namespace std;
int f[100005];
int n,m,MAX,now,ans;
int v[25],a[105],b[105];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++) scanf("%d",&v[i]);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) 
    {
        if(i==1) b[i]=a[i];else b[i]=a[i]-max(0,a[i-1]-1);
        MAX=max(MAX,b[i]);
    }
    for(int i=1;i<=MAX;i++) f[i]=1000000000;
    for(int i=1;i<=m;i++) 
    for(int j=v[i];j<=MAX;j++) f[j]=min(f[j],f[j-v[i]]+1);
    for(int i=1;i<=n;i++) 
    {
        if(f[b[i]]==1000000000) 
        {
            cout<<"-1"<<endl;
            return 0;
        }
        ans=ans+f[b[i]];
    }
    cout<<ans;    
    return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值