#P1003. 猜数字

猜数字

Background

这是一个交互题的模板。

Description

系统会随机生成 nn 个数 AiA_i,你需要猜测出这 nn 个数的值。请尽量保证你的猜测次数在 1000n1000n 之内。

Format

为了更清晰地演示交互题的使用方法,我们设计了三种操作:

  1. get_num:获取需要猜测的数字数量 nn 。本操作不包含参数。
  2. guess:猜测某个数字。本操作包含 2 个参数:需要猜测的数字的序号(从 0 开始)以及猜测值。当你猜测的值小于实际值时,返回值为 -1;当你猜测的值大于实际值时,返回值为 1;当恰好猜对时,返回值为 0
  3. submit:提交猜测结果。本操作包含 nn 个参数,即 nn 个数的猜测结果。本操作没有返回值。

当你想要进行某个操作时,请向标准输出流中写入如下格式的字符串:

<操作名称> <操作参数 1> <操作参数 2> ... <操作参数 n>

必须在请求后追加换行符;多余的空白字符将被自动忽略。

在收到用户程序发送的请求后,交互器会向用户程序的标准输入流中发送返回值。你只需在你的程序中使用通常的办法读入这个值,就好像是从控制台或文件中读取内容一样。交互器将在发送返回值后再附加一个换行符 \n,以便于用户程序读入。本题目的操作返回值都是数字,因此直接读入数字即可。

请注意,很多语言的输入 / 输出库都会带有缓存,请在写入操作请求后手动刷新缓存,以确保请求顺利递送。

C fflush(stdout)
C++ std::cout << std::flush
Java System.out.flush()
Python sys.stdout.flush()
Pascal flush(output)
Rust std::io::stdout().flush().unwrap()
Haskell hFlush stdout
Go Unbuffered

可以参考附加文件中的 C++ 实现 interaction.h

Samples

1

-1

0
get_num

guess 0 802

guess 0 806

submit 806

Limitation

数量 1n1001 \leq n \leq 100 要猜测的数字 0Ai10000000 \leq A_i \leq 1000000

对于每个测试点,设你的猜测次数为 xx,则你的得分为 max(min(100,(950(xn100))/950×100),0)\max(\min(100, (950 - (\frac{x}{n} - 100)) / 950 \times 100), 0)

每次猜测均为 I / O 操作,消耗时间较多,如果猜测次数过多将导致超时。

Attachment

interaction.h

#include <iostream>
#include <vector>

int get_num()
{
    std::cout << "get_num" << std::endl << std::flush;
    int ret;
    std::cin >> ret;
    return ret;
}

int guess(int index, int x)
{
    std::cout << "guess " << index << " " << x << std::endl << std::flush;
    int ret;
    std::cin >> ret;
    return ret;
}

void submit(const std::vector<int> &result)
{
    std::cout << "submit ";
    for (std::vector<int>::const_iterator iter = result.begin(); iter != result.end(); iter++)
    {
        std::cout << *iter << " ";
    }
    std::cout << std::endl << std::flush;
}

template.cpp

#include "interaction.h"

int solve(int i) {
    // TODO: add your code here
}

int main() {
    int n = get_num();
    std::vector<int> a(n);

    for (int i = 0; i < n; i++) {
        a[i] = solve(i);
    }

    submit(a);
}