2019ICPC 南京網賽 F. Greedy Sequence
標籤
- 難想的暴力
前言
- 我的csdn和博客園是同步的,歡迎來訪danzh-博客園~
- 這題讀題好費勁…
簡明題意
- 讀題太費勁了。
- 給定序列a[],現在需要你構造n個序列:
- 每個序列,然後對於每個s序列,相鄰的兩個數在a[]序列中的下標差不超過k。現在每個序列需要字典序最大,然後問你所有數列的數字數量累加起來是多少。
思路
- 字典序最大是突破口。有了這個限制,我們可以直接從序列的第一個元素開始考慮。第一個元素是i,那麼直接遍歷i-1到1,一旦滿足下標差<=k,就應該添加到s中。
- 我代碼中的排序應該是不用寫的。
注意事項
- 無
總結
- 無
AC代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
struct Node
{
int val, pos;
bool operator < (const Node& a)
{
return val < a.val;
}
};
int n, k, ans[maxn];
Node a[maxn];
void solve()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i].val), a[i].pos = i;
sort(a + 1, a + 1 + n);
int cnt = 0;
for (int i = 1; i <= n; i++)
{
ans[i] = 1;
for (int j = i - 1; j >= 1; j--)
if (abs(a[j].pos - a[i].pos) <= k)
{
ans[i] = ans[j] + 1;
break;
}
printf("%d", ans[i]);
if (i != n)
printf(" ");
}
printf("\n");
}
}
int main()
{
//freopen("Testin.txt", "r", stdin);
solve();
return 0;
}