codeforces #407(div1c div 2e)The Great Mixing

给出k瓶可乐,浓度为ai/1000,输出最少用多少瓶才能配出浓度为n的可乐?

分析:显然,每个浓度对最终浓度的贡献是ai-n,如果最终总和贡献为0的时候,那就是一个答案

那么,浓度贡献的范围是[-1000,1000],+1000映射到[0,2000],

只要关心每一个贡献出现的时候最少多少瓶就Ok了

bfs搜一发

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+5;
 4 int n,k;
 5 
 6 int a[maxn],b[maxn],v,tot=0;
 7 
 8 queue<int> q;
 9 
10 int main(){
11     scanf("%d%d",&n,&k);
12 
13     for(int i=0;i<k;i++){
14         scanf("%d",&v);
15         a[v]=1;
16     }
17 
18     if(a[n]==1){
19         puts("1");
20         return 0;
21     }
22 
23 
24 
25     for(int i=0;i<=1000;i++)if(a[i]==1){
26         b[tot++]=i;
27         q.push(i-n+1001);
28     }
29 
30     for(int i=0;i<tot;i++)a[b[i]-n+1001]=1;
31 
32     while(!q.empty()){
33         int val=q.front();q.pop();
34         val-=1001;
35 
36         for(int i=0;i<tot;i++){
37             int vv=val+b[i]-n;
38 
39             if(vv==0){
40                 printf("%d\n",a[val+1001]+1);
41                 return 0;
42             }
43             vv+=1001;
44             if(vv<0)
45             {
46                 continue;
47             }
48             if(!a[vv]){
49                 a[vv]=a[val+1001]+1;
50                 q.push(vv);
51             }
52         }
53     }
54 
55 
56     puts("-1");
57 
58 
59 
60 
61     return 0;
62 }
View Code

 

posted @ 2017-04-05 22:11  N维解析几何  阅读(134)  评论(0编辑  收藏  举报