E - Alignment
题意:
开始士兵们按照序号排队。
但是站不齐。
军官想让他们站齐。
所以让一些士兵离开队伍。
(只要士兵能看到 线的其中一个端点 就能排齐)
要求: 求出至少要出去多少士兵。
解:
所以要两个数组。
第一个数组存的是 一个士兵为结尾 从左到右身高升序的最大人数(i = 0 贪心 到 n -1)
第二个数组存的是 一个士兵结尾 从右到左身高降序的最大人数。(i = n - 1 贪心到 0)
(在线上的 士兵)可能的结果
知道线上的士兵最多还剩多少个 就知道最少要出去多少个
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int i, j;
int n, pe[1005], de[1005];
float h[1005];
scanf("%d", &n);
memset(pe, 0, sizeof(pe));
memset(de, 0, sizeof(de));
for(i = 0;i < n;i++)
{
scanf("%f", h+i);
}
for(i = 0;i < n;i++)//升序贪心
{
int max = 0;
for(j = 0;j < i;j++)
{
if(h[j] < h[i])
{
if(max < pe[j]+1)
{
max = pe[j]+1;
}
}
}
pe[i] = max;
}
for(i = n-1;i >=0;i--)//降序贪心
{
int max = 0;
for(j = n-1;j > i;j--)
{
if(h[j]< h[i])
{
if(max < de[j]+1)
max = de[j]+1;
}
}
de[i] = max;
}
int Ma = 0;
for(i = 0;i < n;i++)
{
for(j = i;j < n;j++)
{
int t;
if(i == j)t = 1;
else t = 2;
if(pe[i]+de[j]+t > Ma)
{
Ma = pe[i]+de[j]+t;
}
}
}
printf("%d", n-Ma);
return 0;
}