Let S be a sequence of integers s1, s2, ..., sn Each integer is is associated with a weight by the following rules:
(1) If is is negative, then its weight is 0.
(2) If is is greater than or equal to 10000, then its weight is 5. Furthermore, the real integer value of si is si−10000 . For example, if si is 10101, then is is reset to 101 and its weight is 5.
(3) Otherwise, its weight is 1.
A non-decreasing subsequence of S is a subsequence si1, si2, ..., sik, with i1<i2 ... <ik, such that, for all 1≤j<k, we have sij<sij+1.
A heaviest non-decreasing subsequence of S is a non-decreasing subsequence with the maximum sum of weights.
Write a program that reads a sequence of integers, and outputs the weight of its
heaviest non-decreasing subsequence. For example, given the following sequence:
80 75 73 93 73 73 10101 97 −1 −1 114 −1 10113 118
The heaviest non-decreasing subsequence of the sequence is <73,73,73,101,113,118> with the total weight being 1+1+1+5+5+1=14. Therefore, your program should output 14 in this example.
We guarantee that the length of the sequence does not exceed 2∗105
Input Format
A list of integers separated by blanks:s1, s2,...,sn
Output Format
A positive integer that is the weight of the heaviest non-decreasing subsequence.
样例输入
80 75 73 93 73 73 10101 97 -1 -1 114 -1 10113 118
样例输出
14
题目来源
题意:就是给你一串数字,以输入结束符结束输入,然后在这些数字中,小于零的数字权值为 0,大于等于10000的数字的权值为 5,而且这些数字要减去10000,其余数字的权值为 1 。
题解:这题有点坑,比赛时我就没做到,其实大于10000的数字的权值为 5,可不可以就等于5个权值为1的数字呢。然后这道题就变成时间为nlog(n)的最长上升子序列了。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
///o(っ。Д。)っ AC万岁!!!!!!!!!!!!!!
const int maxn = 15520200;
int maps[maxn] = {}, dp[maxn] = {};
int bin_searchs(int l, int r, int k)
{
if(l >= r)
{
return l;
}
int mid = (l + r + 1) / 2;
if(dp[mid] > k)
{
return bin_searchs(l, mid - 1, k);
}
else return bin_searchs(mid, r, k);
}
int main()
{
int cnt = 0, book;
while(scanf("%d", &book) != EOF)
{
if(book >= 10000)
{
book -= 10000;
for(int i = 1; i <= 5; i++)
{
maps[++cnt] = book;
}
}
else if(book < 0)
{
continue;
}
else maps[++cnt] = book;
}
int counter = 1;
dp[1] = maps[1];
for(int i = 2; i <= cnt; i++)
{
if(maps[i] >= dp[counter])
{
dp[++counter] = maps[i];
}
else
{
int kk = bin_searchs(1, counter, maps[i]);
if(dp[kk] <= maps[i])
{
kk++;
}
dp[kk] = maps[i];
if(kk > counter) counter++;
}
}
printf("%d\n", counter);
return 0;
}
/*
*/