2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest B. Minimum and Maximum交互式题目
Minimum and Maximum
题目大意:
输入T组数据,以n开头,表示有n个数;
以 (?a b)的形式询问,a b 两个数的大小关系
在【3n/2】-2次询问以内,以(!Min Max)返回最大最小的数
思维:
在n3/2次内找出最大最小值几乎不用怎么优化;
先1 2,3 4,5 6…比较n/2次,分成小组和大组
每组所有数和第一个数比较为2*(n/2-1)次;
刚好为(n*3/2)-2次
其次为交互式
即每次输出都要清空缓存区,关键代码为:
printf("? %d %d\n", a, b);
fflush(stdout);
每次输出都要清空!包括最后的输出!
以下为ac代码:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#pragma warning (disable:4996)
vector<int> up, down;
int main()
{
int T, n;
char ch;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
up.clear(); down.clear();
for (int i = 1; i < n; i += 2)
{
printf("? %d %d\n", i, i + 1);
fflush(stdout);
cin >> ch;
if (ch == '<')
down.push_back(i), up.push_back(i + 1);
else
down.push_back(i + 1), up.push_back(i);
}
if (n & 1)
down.push_back(n), up.push_back(n);
int Min = down[0], Max = up[0];
for (int i = 1; i < down.size(); i++)
{
printf("? %d %d\n", Min, down[i]);
fflush(stdout);
cin >> ch;
if (ch == '>')
Min = down[i];
}
for (int i = 1; i < up.size(); i++)
{
printf("? %d %d\n", Max, up[i]);
fflush(stdout);
cin >> ch;
if (ch == '<')
Max = up[i];
}
printf("! %d %d\n", Min, Max);
fflush(stdout);
}
}