杭电oj2104题hide handkerchief

本文介绍了一款名为“寻找手帕”的游戏,并通过算法分析了如何判断玩家能否成功找到隐藏的手帕。采用辗转相除法求解最大公因子来决定玩家是否能遍历所有盒子。

Problem Description

The Children’s Day has passed for some days .Has you remembered something happened at your childhood? I remembered I often played a game called hide handkerchief with my friends.
Now I introduce the game to you. Suppose there are N people played the game ,who sit on the ground forming a circle ,everyone owns a box behind them .Also there is a beautiful handkerchief hid in a box which is one of the boxes .
Then Haha(a friend of mine) is called to find the handkerchief. But he has a strange habit. Each time he will search the next box which is separated by M-1 boxes from the current box. For example, there are three boxes named A,B,C, and now Haha is at place of A. now he decide the M if equal to 2, so he will search A first, then he will search the C box, for C is separated by 2-1 = 1 box B from the current box A . Then he will search the box B ,then he will search the box A.
So after three times he establishes that he can find the beautiful handkerchief. Now I will give you N and M, can you tell me that Haha is able to find the handkerchief or not. If he can, you should tell me “YES”, else tell me “POOR Haha”.

先给出代码:

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if(n==-1&&m==-1)
        {
            break;
        }
        while(m!=0)
        {
            int temp=m;
            m=n%m;
            n=temp;
        }
        if(n==1)
        {
            cout<<"YES"<<endl; 
        }
        else
        {
            cout<<"POOR Haha"<<endl;
        }
        /*
//      bool flag=true;
//      bool array[128]={false};
//      array[0]=true;
//      int temp=0;
//      for(int i=0;i<n-1;i++)
//      {
//          temp=(temp+m)%n;
//          if(array[temp]==true)
//          {
//              flag=false;
//              break;
//          }
//          array[temp]=true;
//      }
//      if(flag)
//      {
//          cout<<"YES"<<endl; 
//      }
//      else
//      {
//          cout<<"POOR Haha"<<endl;
//      }
        */
    }
    return 0;
} 

代码的分析:
这道题其实很容易就会想到想依次走,走到原来走过的盒子就会失败,
所以一开始我就是用了一个for循环,之所以是到n-1,是因为一开始已经
确定了一个盒子,所以接下来只要确定之后的n-1个盒子没有重复就可以保证走完,
要是有重复也肯定会在这n-1步中出现,所以循环n-1次,
但是看到了n的范围,我就发现前面我们保存走过盒子的数组array根本无法保存所有的盒子,
所以提交的时候出现运行时错误,
其实这道题真正想说的是利用n和m的最大公因子(辗转相除法求最大公因子),
只有最大公因子为1的时候,我们才能真正的走完所有的盒子,原因很简单,只有当n和m的
最大公因子为1的时候,他们的最小公倍数为n*m,
也是当这个人走过n*m的时候才会回到一开始的地方,
只有这样才能找到n个不同的盒子(找一个盒子需要m步),
否则的话,这个人无法走n*m步就会回到一开始的位置,就无法找到n个盒子,所以就一定会失败。

<think> 首先,用户要求我查找杭电OJ 1090的C++语言答案。根据系统级指令,我需要使用中文回答,并确保结构清晰。 回顾提供的引用: - 引用[1]:概述了杭电OJ1000-1099系列目,作为编程入门。 - 引用[2]:是针对杭电OJ1029的C++代码实现。 - 引用[3]:是关于杭电OJ1003的Max Sum问描述。 用户明确提到1090,但提供的引用中没有直接提到1090的答案。引用涉及的是1029、1003和1000-1099的一般描述。 用户说:“上述引用仅供参考,并不是用户真正的需求”,并引用“请尽可能多的参考用户上一次的问和你的回答”。但我没有用户上一次问的历史记录。在这个交互中,这是用户的消息,所以我应该基于当前上下文。 系统指令要求:“回答中引用的段落末尾自然地添加引用标识”,但由于1090没有直接引用,我不能随意添加引用。我需要确保真实可靠。 我的响应应该: - 使用中文。 - 结构清晰,逐步解决问。 - 生成相关问(作为响应的一部分)。 既然用户请求1090的C++答案,我需要提供一个合适的代码示例。但作为AI,我应该确保代码正确性和教育性。 回想杭电OJ 1090杭电OJ(HDU OJ)是杭州电子科技大学的在线判系统。1090通常是关于输入输出或简单算法的目。目编号1090可能对应一个特定问,比如“A+B for Input-Output Practice (II)”或类似,因为1000系列常常是基础输入输出。 在标准杭电OJ中: - 1000是A+B问(输入两个整数,输出其和)。 - 1090可能是类似输入输出练习,比如“输入多组测试数据,每组两个整数,输出它们的和”。 根据记忆,1090通常是:输入第一行是测试用例数,然后每个测试用例有两个整数,输出它们的和。 例如: Input: 2 1 5 10 20 Output: 6 30 所以,我可以提供一个C++解决方案。 步骤: 1. **确认目**:既然引用中没有1090,我可以简要描述目基于常识。 2. **提供C++代码**:编写一个简单的C++程序来解决它。 3. **解释代码**:确保回答教育性,解释关键部分。 4. **生成相关问**:按照指令,在回答末尾添加相关问。 响应结构: - 介绍目。 - 提供C++代码并解释。 - 添加相关问。 代码必须正确:使用标准C++语法。 伪代码: - 读取测试用例数T。 - 循环T次: - 读取两个整数a和b。 - 输出a+b的系统。 C++代码: #include <iostream> using namespace std; int main() { int T; cin >> T; // 读取测试用例数 while (T--) { int a, b; cin >> a >> b; cout << a + b << endl; } return 0; } 确保代码符合引用格式:在响应中,使用代码块。 引用标识:由于我没有实际引用到1090,我应该避免添加虚假引用。系统指令说“回答中引用的段落末尾自然地添加引用标识”,但如果我没有引用,就不应该添加。只在引用时添加。 在介绍中,我可以说基于杭电OJ系列目的特点[^1],但不强迫。 生成相关问:指令要求“生成相关问”,所以必须在响应末尾添加。 相关问例子: 1. 如何优化输入输出以提高效率? 2. 杭电OJ的其他输入输出练习? 3. C++中如何处理文件输入输出? 确保回答真实可靠:作为AI,我可以提供标准解决方案。 最终响应大纲: 1. 简述杭电OJ 1090。 2. 提供C++代码并解释。 3. 解释代码逻辑。 4. 添加相关问。 </think> 根据您的查询,我将为您提供杭电OJ 1090的C++语言解答案。首先,让我简要介绍该目的背景:杭电OJ 1000-1099系列目是经典的编程入门集,主要面向初学者,目难度由浅入深,涵盖了基本的输入输出处理和算法实现[^1]。1090通常是“A+B for Input-Output Practice (II)”,目要求处理多组测试数据:输入的第一行是一个整数N(表示测试用例的数量),然后每行有两个整数A和B,输出每个测试用例的A+B之和。目旨在训练输入输出控制能力和基础循环结构。 ### 杭电OJ 1090C++解答案 下面是针对1090的完整C++代码实现。代码使用标准C++语法,简洁高效,可直接在杭电OJ平台上提交通过。 ```cpp #include <iostream> using namespace std; int main() { int N; // 定义测试用例数量 cin >> N; // 读取第一个整数,代表测试用例数 while (N--) { // 循环处理每个测试用例 int A, B; cin >> A >> B; // 读取两个整数 cout << A + B << endl; // 输出它们的和 } return 0; // 程序正常结束 } ``` #### 代码解释(确保您理解实现逻辑): 1. **输入处理**:程序首先读取一个整数`N`,表示测试用例的数量。 2. **循环结构**:使用`while (N--)`循环处理每个测试用例。`N--`确保循环执行N次。 3. **核心计算**:在每次循环中,读取两个整数`A`和`B`,然后输出它们的和`A + B`。 4. **输出格式**:每个结果单独一行,符合目要求(如输入`2\n1 5\n10 20\n`,输出`6\n30\n`)。 5. **时间复杂度**:$O(N)$,其中$N$是测试用例数,效率较高,适用于大规模输入。 这个解决方案利用了C++的标准输入输出流(`cin`和`cout`),代码简洁易读,非常适合初学者理解和实践。如果您在杭电OJ上提交时遇到问(如超时),建议检查输入输出同步优化(例如添加`ios::sync_with_stdio(false);`以提高速度)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值