模拟人机交互类题目

  人机交互,顾名思义,就是人与计算机间的交流互动,我们对计算机的每一次操作程序中的每一条语句都是与计算机的交流,这类题目是将人和计算机调换位置,例如猜数游戏,常规的做法是让人输入数,计算机判断大还是小,而这类人机交互题目中需要你的程序充当人来输入数据,再自己来判断大小。

例题1:猜数游戏http://codeforces.com/gym/101021

分析:范围[1,1e6],二分判断。程序输出数字,我们输入大小。(这个代码是随机数)。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     srand((int)time(0));
 7     string str;
 8     int max=1e6,min=1;
 9     int T=25,a;
10     a=(rand()%(max-min))+min;
11     cout<<a<<endl;
12     fflush(stdout);
13     while(T--&&(max-min)!=1)
14     {
15         cin>>str;
16         if(str==">=")
17         {
18             min=a;
19             a=(rand()%(max-min))+min;
20         }
21         else
22         {
23             max=a;
24             a=(rand()%(max-min+1))+min;
25         }
26         if(T==0||(max-min)==1)
27             cout<<"! ";
28         cout<<a<<endl;
29         fflush(stdout);
30     }
31 //    cout<<‘!‘<<(rand()%(max-min+1))+min<<endl;
32 //    fflush(stdout);
33     return 0;
34     }

例题2:方(芳)格(哥)取数 http://www.51isoft.com/v3/problem_show.php?pid=34980  北师大OJ(冷清,只有我一个人让我的连WA很明显)。

分析:一个矩阵,每个坐标对应的数值大小从上往下从左往右递增,要求已知数值在不在矩阵内。程序输出坐标查询,我们输入该坐标的对应值。

思路:现从每一行的最右侧记最大值开始查询,找到比已知数值大的数,则该点位于此行中,再从友向左遍历便可。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m,k,ans,i,j,flag=0;
        cin>>n>>m>>k;
        int sum=n+m;
        i=1;j=m;
        while(sum--)
        {
            cout<<i<<‘ ‘<<j<<endl;
            cin>>ans;
            if(ans==k)
            {
                flag=1;
                break;
            }
            else if(ans<k)    i++;
            else    j--;
            if(j<1||i>n)    break;//若ans<k则位置在本行。再从m递减找到位置
        }
        if(!flag)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}

例题3:CF680C。

C. Bear and Prime 100

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

This is an interactive problem. In the output section below you will see the information about flushing the output.

Bear Limak thinks of some hidden number — an integer from interval [2, 100]. Your task is to say if the hidden number is prime or composite.

Integer x > 1 is called prime if it has exactly two distinct divisors, 1 and x. If integer x > 1 is not prime, it‘s called composite.

You can ask up to 20 queries about divisors of the hidden number. In each query you should print an integer from interval [2, 100]. The system will answer "yes" if your integer is a divisor of the hidden number. Otherwise, the answer will be "no".

For example, if the hidden number is 14 then the system will answer "yes" only if you print 2, 7 or 14.

When you are done asking queries, print "prime" or "composite" and terminate your program.

You will get the Wrong Answer verdict if you ask more than 20 queries, or if you print an integer not from the range [2, 100]. Also, you will get the Wrong Answer verdict if the printed answer isn‘t correct.

You will get the Idleness Limit Exceeded verdict if you don‘t print anything (but you should) or if you forget about flushing the output (more info below).

Input

After each query you should read one string from the input. It will be "yes" if the printed integer is a divisor of the hidden number, and "no" otherwise.

Output

Up to 20 times you can ask a query — print an integer from interval [2, 100] in one line. You have to both print the end-of-line character and flush the output. After flushing you should read a response from the input.

In any moment you can print the answer "prime" or "composite" (without the quotes). After that, flush the output and terminate your program.

To flush you can use (just after printing an integer and end-of-line):

  • fflush(stdout) in C++;
  • System.out.flush() in Java;
  • stdout.flush() in Python;
  • flush(output) in Pascal;
  • See the documentation for other languages.

Hacking. To hack someone, as the input you should print the hidden number — one integer from the interval [2, 100]. Of course, his/her solution won‘t be able to read the hidden number from the input.

Examples

Input

yesnoyes

Output

2805composite

Input

noyesnonono

Output

585978782prime

分析:与猜数问题类似,我们心里想一个数,让程序来猜是素数还是和数。程序输出一个数我们出入是否能被整除。思路:每个和数都可看成两个素数之积,题目范围是2~100所以我们只需要考虑2~50的素数(2*51就超过了100)。用2~50的素数来检验。当能被两个素数整除的时候就可确认为和数。特别注意4,9,25,49.
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
    int i=0,flag=0,T=20;
    string str;
    while(T--)
    {
        cout<<prime[i]<<endl;
        fflush(stdout);
        cin>>str;
        if(str=="yes")    flag++;
        if(flag==1&&(i==0||i==1||i==2||i==3))//如果是2,3,5,7则须再判断一次。
        {
            cout<<prime[i]*prime[i]<<endl;
            fflush(stdout);
            cin>>str;
            if(str=="yes")    flag++;
        }
        if(flag==2||i==14)    break;
        i++;
    }
    if(flag==2)    cout<<"composite"<<endl;
    else    cout<<"prime"<<endl;
    return 0;
}
时间: 2024-10-06 13:21:57

模拟人机交互类题目的相关文章

6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式] 第1行:一个整数n,表

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

概率和期望类题目综合分析

先给出学习资料吧:kuangbin的博客:  https://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html kuangbin的博客里面有3篇论文,讲的非常好,但是有点难(非常难),推荐全部打印下来 首先概率和期望类题目有哪几种做法呢? 用鬲融的总结的话有以下几种:直接计算(这样只要考验你的公式推理,一点代码都不需要)  动态规划的方法(也就是传说中的概率正着算,期望反着求)迭代的方法(其实我分不太清这样和动态规划的区别) 概率-

python自测——操作类题目

操作类题目 49.Python 交换两个变量的值50.在读文件操作的时候会使用 read.readline 或者 readlines,简述它们各自的作用51.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?52.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中.54.如果当前的日期为 20190530,要求

POJ 1979 POJ 3009 AOJ 0033 AOJ 0118 [搜索类题目][0033贪心模拟]

/** POJ 1979 BFS */ #include <stdio.h> #include <string.h> #include <iostream> #include <queue> using namespace std; const int N = 20 + 5; int mp[N][N]; int sx,sy; int n, m; int vis[3000]; int dirx[] = {0, 1, 0, -1}; int diry[] = {

java实现链表模拟LinkedList类

LinkedList类底层数据结构 模拟: 1 package Collection; 2 3 public class MyLinkedList { 4 Node first; 5 Node last; 6 private int size; 7 public MyLinkedList(){ 8 9 } 10 /* 11 * 添加一个新对象 12 * */ 13 public boolean add(Object obj){ 14 Node node = new Node(); 15 if(f

2.3日期类题目题解

今天追的综艺更新了,没想到超长待机三个小时,再加上乱七八糟的事情耽误了很多的时间,没有时间更新今日份所有题目的总结了.恰好今天这套题很多都是一个类型的题目那就分开整理吧,今天更新计算日期类的题目,其他的等明天继续更. 关于计算日期类的题目,可以说都很简单了,而且一般都是小题.就算不会代码差不多电脑自带的日期啊.execl啊都能做,所以我之前都是用的vbs做的,挺方便的.但是听大佬说国赛没有execl什么的正好今天的题有几道关于日期的题目,趁这个机会整理出来.稍后更新一篇常用的方法吧. 第一题:高

其他类题目

1.1 python模拟LRU(Least recently used,最近最少使用)   定义:算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”.   核心: 1. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部: 2. 当链表满的时候,将链表尾部的数据丢弃. 1.实现原理 1)使用三个数据标识这个缓存系统 self.cache = {}                   # cache模拟所有缓存系统中数据 key: val

java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息. (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样的,不错嘛!会说话了!”的信息. (3)在People类中新增方法void think(),在thi