2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest B. Minimum and Maximum交互式题目

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)返回最大最小的数
思维:
在n
3/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);
 	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值