交互输入题

给你 n m c

代表有n张白纸,编号1-n,    系统会给你m次以内 得询问 每次给你一个[1 , c]的数字

你可以将这个数字填在某张纸上 如果该纸上有写数字了 你可以对其进行更改

要你打印出 每一次系统给的数字你是填在的纸的编号

请问如何填能够在 所有纸被填满的那一刻 让纸上的数字沿着编号非递减

题解:

有 m的取值范围 为 c/2 * n

所以每张纸最多都可以被填 c/2

所以我们只要贪心 把输入的数字x二分,分成两个部分 x > c/2 :从最后面 往前 构造 递减序列  x<=c/2  从最前面 往后 构造递增序列

遍历 当前纸上数字与输入的数字进行比较 更改 没有数字则直接填上数字

那么最糟糕的情况  会循环n * c/2

每次 填完数字都要进行判断当前的纸是否被填完了

/*
Algorithm:
Author: anthony1314
Creat Time:
Time Complexity:
*/

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 200005
//#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;
int now;//当前有几个格子被填满了
int n, m, c, a[maxn];
/*
m(最大)= n * (c/2);
因此将输入的数分为两种情况
*/
int main() {
	memset(a, 0, sizeof(a));
	cin>>n>>m>>c;
	c /= 2;
	while(m--) { //m轮以内
		int x;
		scanf("%d", &x);
		if(x <= c) {
			for(int i = 1; i <= n; i++) {
				if(a[i] == 0 || a[i] > x) {
					a[i] = x;
					printf("%d\n", i);
					fflush(stdout);
					break;
				}
			}
		} else {
			for(int i = n; i >= 1; i--) {
				if(a[i] == 0 || a[i] < x) {
					a[i] = x;
					printf("%d\n", i);
					fflush(stdout);
					break;
				}
			}
		}
		now = 0;
		for(int i = 0; i < n; i++){
			if(a[i] != 0){
				now++;
			}
		}
		if(now == n){
			break;
		}
	}


	return 0;
}