点击打开题目
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1268 Accepted Submission(s): 476
Problem Description
我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。 请输出最少需要修改多少个元素。
Input
第一行输入一个 ,表示有多少组数据 每一组数据: 第一行输入一个 ,表示数列的长度 第二行输入N个数 。 每一个数列中的元素都是正整数而且不超过 。
Output
对于每组数据,先输出一行 Case #i: 然后输出最少需要修改多少个元素。
Sample Input
2
2
1 10
3
2 5 4Sample Output
Case #1:
0
Case #2:
1Source
2015年百度之星程序设计大赛 - 初赛(2)
满足条件的情况为:a [ i ] - a[ j ] >= i - j 移项一下,然后就变成求LIS的问题了。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int main()
{
int u;
int n;
int a[100000+11];
int g[100000+11];
int Case = 1;
scanf ("%d",&u);
while (u--)
{
scanf ("%d",&n);
for (int i = 1 ; i <= n ; i++)
scanf ("%d",&a[i]) , a[i] -= i , g[i] = INF;
printf ("Case #%d:\n",Case++);
int pos;
int ans = 0;
for (int i = 1 ; i <= n ; i++)
{
pos = upper_bound (g+1 , g+1+n , a[i]) - g;
ans = max (ans , pos);
g[pos] = min (g[pos] , a[i]);
}
printf ("%d\n",n-ans);
}
return 0;
}