专栏文章

题解:UVA10550 Combination Lock

UVA10550题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mingtf6q
此快照首次捕获于
2025/12/02 02:11
3 个月前
此快照最后确认于
2025/12/02 02:11
3 个月前
查看原文
本蒻蒟第一篇题解,请大佬见谅,如有问题,还请斧正
我刚看到题目就想到这是一个非常简单的大模拟,就写了一个诗山大模拟(也就是下面的代码),结果一提交发现需要绑定UVA账号,我本人当时直接蒙了

题目翻译(来自AI)

‌UVA 10550-密码锁(Combination Lock)‌
‌题目描述:
你有一个密码锁,初始位置为 00。要打开它,需要按照以下步骤操作:
  1. 顺时针旋转两圈‌(720720 度)
  2. 继续顺时针旋转‌,直到到达第一个目标数字(记为 firstfirst
  3. 逆时针旋转一圈‌(360360 度)
  4. ‌继续逆时针旋转‌,直到到达第二个目标数字(记为 secondsecond
  5. 最后顺时针旋转‌,直到到达第三个目标数字(记为 thirdthird
‌输入格式: ‌
每行输入四个整数:
起始位置(0start390\le start\le39
第一个目标数字 firstfirst0first390\le first\le39
第二个目标数字 secondsecond0second390\le second\le39
第三个目标数字 thirdthird0third390\le third\le39
输入以四个 00 结束。 ‌输出格式:‌
对于每组输入,输出转动密码锁所需的总度数(整数)。

解题思路

首先,无论密码是多少,你必须要转三整圈,所以结果一定是大于 360×3360\times3 的,也就是 10801080 度,密码锁一圈有四十个格子,所以一个格子是九度。
可以先将结果初始化为 10801080 度,这样后面就可以不用管先转两圈顺时针后转一圈逆时针了。
然后就到了比较需要你进行巴巴博弈的地方了。
从初始位置 (start)(start) 到第一个密码 (first)(first) 的位置时,如果 startfirststart\ge first,那么你只需要转 (startfirst)×9(start-first)\times9 度;反之,则在转的时候需经过零刻度线,需转 [40(startfirst)]×9[40-(start-first)]\times9 度。
随后,从第一个密码 (first)(first) 到第二个密码 (sacond)(sacond) 时需要注意是逆时针转而不是和第一次一样,如果 firstsecondfirst\ge second,那么你在转的时候会过零刻度线,所以需要转 [40(firstsecond)]×9[40-(first-second)]\times9 度,反之转 (secondfirst)×9(second-first)\times9 度。
第三步是转第三个密码,转第三个密码和转第一个密码是一样的思路和过程,可以参考转第一个密码的代码。
输入结束是以四个零结束,只需要用 while 循环实现输入,读到四个零就结束。
最后的最后就是提交代码,但你可能会发现“什么?!需要绑定 UVA!”

代码如下

CPP
#include<bits/stdc++.h>
using namespace std;
int main(){
    long long start,first,second,third,sum;
    while(cin>>start>>first>>second>>third){
        if(start==0&&first==0&&second==0&&third==0){
            return 0;//题目是以0 0 0 0结尾
        }
        sum=1080;
        if(start>=first){
            sum+=(start-first)*9;
        }else{
            sum+=(40-(first-start))*9;
        }
        if(first>=second){
            sum+=(40-(first-second))*9;
        }else{
            sum+=(second-first)*9;
        }
        if(second>=third){
            sum+=(second-third)*9;
        }else{
            sum+=(40-(third-second))*9;
        }
        cout<<sum<<endl;
    }
    return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...