问题分析
以每一刻的时间为节点构建一张图,对于每个节点,用按钮加边,然后 BFS B F S 或者 dijkstra d i j k s t r a 找最短路径就可以了。
#include <bits/stdc++.h>
using namespace std;
int t,n,cook, vis[4000], a[17], presses[4000];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>cook;
memset(vis,0, sizeof(vis));
memset(presses,0, sizeof(presses));
for(int i = 0; i < n; ++i){
cin>>a[i];
}
queue<int> q;
q.push(0);
vis[0] = 1;
while(!q.empty())
{
int cur = q.front();
q.pop();
for(int i = 0; i < n; ++i){
int nxt = min(3600,max(0,cur + a[i]));//时间范围是0 <= t <= 3600
if(!vis[nxt]){
vis[nxt] = 1;
presses[nxt] = presses[cur] + 1;
q.push(nxt);
}
}
}
int i;
for(i = cook; !vis[i]; ++i); //找到可以到达的最小时间
cout<<presses[i]<<' '<<i-cook<<endl;
}
return 0;
}