1. 程式人生 > >CodeForces 789E bfs建模,思維

CodeForces 789E bfs建模,思維

bit first using return uniq cond ... pop 有一個

CodeForces 789E

題意:有k種可樂,每種的測試為ai/1000。 要你合成一種濃度為n/1000的可樂,問最小要杯可樂,每種可樂可重復取。

tags: 要註意到濃度絕不會超過1000/1000。

假設選取m杯可樂,則 (a1+a2+......+am) / m = n,變換一下為(a1-n)+(a2-n)+......+(am-n) = 0。即要選 m杯可樂,其濃度減 n之和為0。而濃度不超過1000,故(a1-n)+(a2-n)+....+(as-n)的和肯定在 -1000~1000之間,所以可以 bfs解,相當於找一條濃度0 到濃度0 的路徑,邊長為(ai-n),這樣到每個可能濃度點的距離一定是最近的。 還有一個坑點,a[i]數組太多,要去重。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define
fi first #define se second typedef long long ll; const int N = 1000005, M = 1010; int n, k, a[N], path[M<<1]; bool vis[M<<1]; int bfs(int u) { queue<int > q; q.push(u); vis[u]=1; int to; while(!q.empty()) { u=q.front(); q.pop(); rep(i,
1,k) { to=u+a[i]; if(to==0) return u+1000; if(-1000<=to && to<=1000) { int x=to+1000; if(vis[x]==0) { vis[x]=1; q.push(to); path[x]=u+1000; } } } } return -1; } int main() { scanf("%d %d", &n, &k); rep(i,1,k) { scanf("%d", &a[i]); a[i] -= n; } sort(a+1, a+1+k); int k1=unique(a+1, a+1+k)-(a+1); k=k1; int ans=bfs(0); if(ans==-1) puts("-1"); else { int cnt=1; while(path[ans]!=0) ans=path[ans], ++cnt; printf("%d\n", cnt); } return 0; }

CodeForces 789E bfs建模,思維