AT46 リモコン(ATC的题)

153 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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了,今年复习了bfsbfs之后再来看这题,就感觉其实还行。

分析

我们发现每次操作理论上可以使得aa变成6个数字,然后我们再判断0≥040≤40的情况,我们就会发现第一次操作可以把他们变成这些情况,第二次,同理可以把第一次的这些数字每个数字变成66种情况,就可以用一个cntcnt数组记录一下每一次变化的数值,再用stst数组判重,最后输出cntb的值就行了,用bfsbfs

代码

#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;
}

希望能帮助到大家(QAQQAQ)!