ACM交互题小结

今天才了解到还有交互题这种问题,很神奇,就不是平常写的那种传统题目。这种题目一般都是让你去输出东西询问,系统输入“YES”或“NO”作为回答,然后让你根据这些“YES”和“NO”得到最终答案。

前置知识:
在一些题目里面(我做的题目也没几道,可能片面了)会经常用到【fflush(stdout)】这个操作。这个操作的用处百度了一下,回答很多,大概的作用就是强制刷新输出缓冲区,将里面的内容输出出来,避免多个连续输出时出现错误。(不过貌似用cout就可以不用这个了)

codeforces 679A
题意:在[2,100]中存在一个隐藏的数,让你判断这个数是质数还是合数。你每次可以输出一个数作为询问是否为隐藏的数的因子,系统会输入一个数当作答案。你最多可以询问20次,询问后输出隐藏的数是质数还是合数。
我们首先知道合数可拆分为素数相乘,所以打一个2~50的质数表,看是否有两个或以上的素数都为隐藏的数的因子。但这样会忽略一种情况,就是质数平方的这种情况,加上这种情况后,可以得知一共19个数(所以20次询问是一定能得到结果的)。直接询问19次然后输出结果即可(也可以当出现两次时就停止输入)。代码还是简单的。

#include 
#include 
#include 
using namespace std;
int prime[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,4,9,25,49 };
char s[10];
int main() 
{
    int cnt = 0;
    for (int i = 0;i<19;i++)
    {
        printf("%d\n", prime[i]);
        fflush(stdout);
        scanf("%s", s);
        if (!strcmp(s, "yes")) cnt++;
    }
    if (cnt >= 2) printf("composite\n");
    else printf("prime\n");
    fflush(stdout);
    return 0;
}

一般这种题目可以理解为输出做输入,输入做输出。通常都是跟二分三分有关,或者自己推导规律。

你可能感兴趣的:(小结)