暑假集训二 Button Bashing
题目来源:http://www.sizaif.com:6680/upload/file/20180717/20180717133439_18137.pdf
题目大意:有一个微波炉运行时间在0-3600秒之内,它有n个按钮,每个按钮代表一个时间即按下按钮后会增加的时间(可能为负数),首先给定t组测试事例(最多100),每个测试事例给定两个数n,m,分别表示按钮的个数和你需要计算的一个时间,下面一行n个数即每个按钮按下后增加的时间,现在你需要计算出达到给定时间m需要按下的次数,以及如果不能正好到达该时间所超出的时间。
分析:简单bfs,找出由给定的n个时间组成的 所有时间的最少的次数。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int a[30],b[3700];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(b,INF,sizeof(b));
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
queue<int>q;
q.push(0);
b[0]=0;
while(!q.empty())
{
int ff=q.front();//first in first out
q.pop();
for(int i=0;i<n;i++)
{
int ss=ff+a[i];
if(ss<0)
ss=0;
else if(ss>3600)
ss=3600;
if(b[ss]<=b[ff]+1)//表示面已有ss的路径
continue;//如果是则跳过下面的代码,进入下个循环
q.push(ss);
b[ss]=b[ff]+1;
}
}
int k;
for(int k=m;k<=3600;k++)
{
if(b[k]!=INF)
{
printf("%d %d\n",b[k],k-m);
break;
}
}
}
return 0;
}
看了好几个题解才写的……