交互输入题
给你 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;
}