持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目
リモコン
题面翻译
题目描述: 高桥君要调整空调的设定温度。现在的设定温度是A度,而他想调到B度。 空调遥控器按一次可以:
- 上调或下调1度
- 上调或下调5度
- 上调或下调10度 高桥君想求出从A调到B度的最小操作数。
输入格式: 输出以下列形式给出。
A B
0<=A,B<=40
输出格式: 输出最小操作数。
样例与说明:
样例1: 输入:
7 34
输出:
5
依次上调10、10、5、1、1度即可
样例2: 输入:
19 28
输出:
2
上调10度、下调1度即可。
样例3: 输入:
10 10
输出:
0
温度一样时无需调整。
感谢 @玉签初报明 提供的翻译。
题目描述
输入格式
输出格式
(哎哟,怎么没有样例啊)
我的评价是其实这是一道不错的练习bfs的题,也是个练习最短路的题。
其实去年做过类似的题目,然后g了,今年复习了之后再来看这题,就感觉其实还行。
分析
我们发现每次操作理论上可以使得变成6个数字,然后我们再判断和的情况,我们就会发现第一次操作可以把他们变成这些情况,第二次,同理可以把第一次的这些数字每个数字变成种情况,就可以用一个数组记录一下每一次变化的数值,再用数组判重,最后输出cntb的值就行了,用。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <iomanip>
#define int long long
#define AC return
#define Please 0
using namespace std;
const int N=1000100;
int n,m;
typedef pair<int,int>PII;
typedef unsigned long long ull;
int a,b;
inline int read(){//快读
int x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
AC x*f;
}
int d[2]={-1,1};
int num[3]={1,5,10},cnt[43];
bool check(int x){
if(x>=0 && x<=40) return true;
return false;
}
bool st[43];
inline void bfs(){
queue<int> q;
q.push(a);
cnt[a]=0;
st[a]=1;
int no=0;
while(q.size()){
int t=q.front();
q.pop();
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
int now=t+d[i]*num[j];
if(check(now) && st[now]==0){
st[now]=1;
cnt[now]=cnt[t]+1;
q.push(now);
}
}
}
}
}
signed main(){
cin>>a>>b;
memset(cnt,0,sizeof cnt);
memset(st,0,sizeof st);
bfs();
cout<<cnt[b]<<endl;
AC Please;
}
希望能帮助到大家()!