100準1107:リモコン


https://www.acmicpc.net/problem/1107

1.近接


  • 利用可能なボタンの数は10個(0~9)に限定される.

  • ボタンで最も近い値を押して+/-に移動する必要があります.
    =>最も近い値は何ですか?
    =>移動する値と最終チャンネル値のステップ値を最小にする必要があります.

  • そこで3つの値を求め,比較して最小値を選択した.
  • は、100チャネルから+/−に直接移動する.(値は|n-100|)
  • が望むチャンネルnから下を探索する.
  • が望むチャンネルnから上を探索する.
  • では、最高値が選択されているので、より小さい値を超えると、繰り返し文が終了します.
  • 2.私の回答

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    
    	int n, m;
    	bool btn[11];
    	char channel[7];
    
    	cin >> n >> m;
    
    	int num = 0;
    	memset(btn, true, 10);
    	for (int i = 0; i < m; i++) { //0~9까지의 bool 배열에서 버튼이 고장이면 false 처리
    		cin >> num;
    		btn[num%10] = false;
    	}
    
    	int count = 0;
    	int now = n;
    	int ret = 0;
    	bool IsBreak=false;
    
    	if (n >= 100)	ret = n - 100; //가장 먼저 |n-100| 값을 넣어준다
    	else ret =(n - 100) * (-1);
    
    	for(int i=1;;i++){ //아래로 내려가면서 탐색
    		while (1) {
    			if (btn[now % 10]) {
    				now /= 10;
    				count++;
    				if (now == 0) { 
    					IsBreak = true;
    					break;
    				}
    			}
    			else break;
    		}
    		if (IsBreak) {
    			ret = min(ret,count); //숫자를 다 만들 수 있다면 최솟값을 넣고 종료
    			break;
    		}
    		if (i > n)	break; //값이 n보다도 커지면(직접 움직이는 것보다 비효율적이면) 종료
    		now = n - i;
    		count = i;
    	}
    	
    	
    	now = n;
    	count = 0;
    	IsBreak = false;
    	for (int i = 1;; i++) { //위로 올라가면서 탐색
    		while (1) {
    			if (btn[now % 10]) {
    				now /= 10;
    				count++;
    				if (now == 0) {
    					IsBreak = true;
    					break;
    				}
    			}
    			else break;
    		}
    		if (IsBreak) {
    			ret = min(ret, count);
    			break;
    		}
    		if (i > ret)	break;
    		now = n +i;
    		count = i;
    	}
    
    	cout << ret << "\n";
    
    	return 0;
    }

    3.他人の回答


    「Bret Force」と呼ばれるアルゴリズムで、すべての値を入れて求めます.
    時間が長くても、コードの中でより簡潔に表現できるそうです.
    チャネルの移動値は、必要な上または下にある場合があります.
    天井の高値まで一つ一つ答えを探す.
    https://yjios.tistory.com/8
    このような問題はもっと良い答えが何なのか分かりません.
    どうせ同じ値段なので、簡潔なコードがもっとよく見えます.