​Button Bashing​

问题分析

以每一刻的时间为节点构建一张图,对于每个节点,用按钮加边,然后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;
}