#P2S2. Interactive A+B Problem

Interactive A+B Problem

这是一道选做题

本题的核心解法与第二题 "A+B Problem" 近乎完全相同,区别是本题为交互题,旨在帮助各位对交互题形式有一定的了解(正式比赛中有可能会出现)。但由于相关的代码和语法内容有一定理解难度,如果实在无法理解可以先跳过本题。

Background

  • 欢迎来到交互入门的学习!
  • 所谓 "交互",就是做题者和评测系统之间的对话。在确定答案之前,你输出的每一份符合格式的内容都代表你向评测机发起了一次 询问,评测机会以输入的形式给出符合题意的回复。然后你只需按照题目所给信息,判断 是否已经得出答案 或者 还需继续询问 即可。当然,你需要满足某些题的特定需求,比如说询问次数不可以超过 3232
  • 注意: 请在输出之后,加一行 flush\mathtt{flush}。这是因为正常情况下你的每次输出都只是被储存到了缓存区,没有真正的输出到程序外部,导致交互程序读取不到你的输出。所以需要调用 flush\mathtt{flush} 方法把缓存区的东西一次性全部输出。更形象的说,就好像人们平时上厕所,在输出完一个阶段的内容后,都会按下马桶的冲水按钮把输出的内容冲掉,再进行下一阶段的输出。这里的 flush\mathtt{flush} 就相当于马桶的冲水按钮。

下面给出 C,C++,Java,Python\mathtt{C, C++, Java, Python} 的输出方式:

  1. C\mathtt{C}

    printf(233);
    fflush(stdout);
    
  2. C++\mathtt{C++}

    cout << 233 << '\n';
    cout.flush();
    
  3. Java\mathtt{Java}

    System.out.println(233);
    System.out.flush();
    
  4. Python\mathtt{Python}

    print(233)
    stdout.flush()
    

题目描述

输入两个整数aabb,求这两个整数的和。

交互方法

本题包含多组测试用例。 第一行给定一个整数 tt,代表测试用例的数量。 接下来,对于每组测试用例,你需要读入一行两个整数 aa, bb,并输出两个整数的和。

  • 在输出一个数之后,你需要按照上述的代码,加一句 flush\mathtt{flush},以防得到错误判定。

在输出之后,你需要读入一个字符串 vv,代表程序对你的答案的判定。如果 vvok,那么你可以继续执行你的代码,否则你需要立即退出你的代码,以防得到 Runtime Error: Killed 判定。

如果你还是不知道怎么交互,可以开翻译阅读一下 codeforces 的官方介绍:

Interactive Problems: Guide for Participants - Codeforces

2
1 2

ok
61 6

ok
3


67

提示

本题部分语言程序实现范例

C

#include <stdio.h>
#include <string.h>

int main(){
    int t;
    scanf("%d", &t);
    while(t --){
        int a, b;
        scanf("%d%d", &a, &b);
        printf("%d\n", a + b);
        fflush(stdout);
        char v[50];
        scanf("%s", v);
        if(strcmp(v, "ok") != 0){
            return 0; //直接退出
        }
    }
    return 0;
}

C++

#include <bits/stdc++.h>

using namespace std;

int main(){
    int t;
    cin >> t;
    while(t --){
        int a,b;
        cin >> a >> b;
        cout << a + b << '\n';
        cout.flush();
        string v;
        cin >> v;
        if(v != "ok"){
            return 0; //直接退出
        }
    }
    return 0;
}

Python3

from sys import stdout, exit

t = int(input().strip())
for _ in range(t):
    a, b = map(int, input().strip().split())
    print(a + b)
    stdout.flush()
    v = input().strip()
    if v != 'ok':
        exit()

Java

import java.util.*;
public class Main {
    public static void main(String args[]) throws Exception {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while(t -- > 0){
            int a = scanner.nextInt(), b = scanner.nextInt();
            System.out.println(a + b);
            System.out.flush();
            String v = scanner.next();
            if(!v.equals("ok")){
                return; //直接退出
            }
        }
    }
}