题意:
每次给你一个数,让你放到一个长度为n 的数组里,直到这个数组填满并且是不递减函数为止。需要 在m步内完成
c是给出的数的范围。
解题思路:
一种显然的暴力方法就是从1开始扫描,遇到第一个大于x的或是a[i]==0的就放。
但是还有显然的卡掉这种暴力的做法,就是把数n-1逐个给出,就每次要替换,这样的话就需要n^2次,显然不行。
所以应该能想到从两边,开始扫描,让大于c/2的从n开始往下扫描,这样刚刚那组数据就可以过了,复杂度正好是n*c/2。
赛时想到往两边放了,但是产生了需要开两个数组的错觉,然后无法合并两个数组,就开始乱搞了。。其实放一个数组里两种不同方法就能搞定,这需要抽象一下。。。
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1005];
int judge()
{
for(int i=1; i<=n; i++)
{
if(a[i]==0)return 0;
if(i<n && a[i]>a[i+1])return 0;
}
return 1;
}
int main()
{
int m, i, j, c;
cin>>n>>m>>c;
for(i=1; i<=m; i++)
{
int x;
scanf("%d", &x);
if(x<=c/2)
{
for(int i=1; i<=n; i++)
{
if(a[i]==0 || a[i]>x)
{
a[i]=x;
cout<<i<<endl;
break;
}
}
}
else
{
for(int i=n; i>=1; i--)
{
if(a[i]==0 || a[i]<x)
{
a[i]=x;
cout<<i<<endl;
break;
}
}
}
if(judge())return 0;
}
return 0;
}