2019ICPC 南京網賽 F. Greedy Sequence 難想的暴力


2019ICPC 南京網賽 F. Greedy Sequence


標籤

  • 難想的暴力

前言

  • 我的csdn和博客園是同步的,歡迎來訪danzh-博客園~
  • 這題讀題好費勁…

簡明題意

  • 讀題太費勁了。
  • 給定序列a[],現在需要你構造n個序列:s1sns_1-s_n
  • 每個序列si[1]=is_i[1]=i,然後對於每個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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章