# Greedy# Math# Simulation

c006 - 10550 - Combination Lock

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算打開一個組合鎖所需的總轉動角度。組合鎖有 40 個刻度 (0-39),密碼由三個數字組成。開鎖步驟包括:順時針轉兩圈,轉到第一個數字,逆時針轉一圈,轉到第二個數字,順時針轉到第三個數字。給定初始位置和密碼,計算總轉動角度。

解題思路

題目描述的開鎖步驟可以分解為幾個部分:

  1. 初始位置到第一個數字:計算順時針或逆時針轉動的角度,取最小的角度。
  2. 第一個數字到第二個數字:逆時針轉動一圈 (360 度),然後計算順時針或逆時針轉動的角度,取最小的角度。
  3. 第二個數字到第三個數字:順時針轉動。計算順時針或逆時針轉動的角度,取最小的角度。

程式碼直接模擬了這些步驟,並計算了總轉動角度。由於每次轉動都是在 0-39 的刻度上進行,因此可以簡單地計算兩個刻度之間的差值,並根據順時針或逆時針方向選擇相應的角度。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
using namespace std;
int main(){
	int a,b;
	while(cin >> a){
		int sum=1080;
		cin >> b;
		if(a==0&&b==0)
			break;
		(b>a)?sum+=(40-b+a)*9:sum+=(a-b)*9;	
		a=b;
		cin >> b;
		(a>b)?sum+=(40-a+b)*9:sum+=(b-a)*9;
		a=b;
		cin >> b;
		(b>a)?sum+=(40-b+a)*9:sum+=(a-b)*9;
		cout << sum << "\n";
	}
}

Discussion