目录
虽然三道题上了200,但还是有点菜
一.优雅的序列
1.题目
2.题解
这道题难就难在重复的数字上,如果没有重复的数字,直接n-1。
不难发现,越小的数越要往前面放,但是又为了尽量避免重复,我们就轮换着放,比如:
1 1 1 2 3 4 4 4 5
就应该变成:
1 2 3 4 5 1 4 1 4
这样就能保证有最多对a[i] < a[i + 1];
具体实践如下:
step1:把每个数字排序后的起点和重复数量存在一个pair数组内;
step2:用len表示最后排好的数组长度,每次枚举每一个数字,直到枚举完每一个数字为止。
step3:统计满足条件的i的个数。
3.Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
int n, k, len;
LL a[100005], ans, a1[100005];
pair <int, int> p[100005];
int main (){
//freopen ("grace.in", "r", stdin);
//freopen ("grace.out", "w", stdout);
scanf ("%d", &n);
for (register int i = 1; i <= n; i ++)
scanf ("%lld", &a[i]);
sort (a + 1, a + 1 + n);
for (register int i = 2; i <= n; i ++){
if (a[i] == a[i - 1]){
int j;
for (j = i; j <= n; j ++)
if (a[j] != a[j - 1])
break;
p[++ k].first = i - 1;
p[k].second = j - i + 1;
i = j;
}
else{
p[++ k].first = i - 1;
p[k].second = 1;
}
}
if (a[n] != a[n - 1]){
p[++ k].first = n;
p[k].second = 1;
}
while (len &l