Let SSS be a sequence of integers s1s_{1}s?1??, s2s_{2}s?2??, ........., sns_{n}s?n?? Each integer is is associated with a weight by the following rules:
(1) If is is negative, then its weight is 000.
(2) If is is greater than or equal to 100001000010000, then its weight is 555. Furthermore, the real integer value of sis_{i}s?i?? is si−10000s_{i}-10000s?i??−10000 . For example, if sis_{i}s?i?? is 101011010110101, then is is reset to 101101101 and its weight is 555.
(3) Otherwise, its weight is 111.
A non-decreasing subsequence of SSS is a subsequence si1s_{i1}s?i1??, si2s_{i2}s?i2??, ........., siks_{ik}s?ik??, with i1<i2 ... <iki_{1}<i_{2}\ ...\ <i_{k}i?1??<i?2?? ... <i?k??, such that, for all 1≤j<k1 \leq j<k1≤j<k, we have sij<sij+1s_{ij}<s_{ij+1}s?ij??<s?ij+1??.
A heaviest non-decreasing subsequence of SSS 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:
808080 757575 737373 939393 737373 737373 101011010110101 979797 −1-1−1 −1-1−1 114114114 −1-1−1 101131011310113 118118118
The heaviest non-decreasing subsequence of the sequence is <73,73,73,101,113,118><73, 73, 73, 101, 113, 118><73,73,73,101,113,118> with the total weight being 1+1+1+5+5+1=141+1+1+5+5+1 = 141+1+1+5+5+1=14. Therefore, your program should output 141414 in this example.
We guarantee that the length of the sequence does not exceed 2∗1052*10^{5}2∗10?5??
Input Format
A list of integers separated by blanks:s1s_{1}s?1??, s2s_{2}s?2??,.........,sns_{n}s?n??
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 超过一万的,权重是5,所以把它变成5个就好啦。这样的话问题就转化成了最长不下降子序列~
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int a[2000005]; 7 int d[2000005]; 8 9 int main() 10 { 11 int x; 12 int n=0; 13 while(scanf("%d",&x)!=EOF) 14 { 15 if (x<0) continue; 16 if (x<10000) a[++n]=x; 17 else 18 for(int i=1;i<=5;i++) a[++n]=x-10000; 19 } 20 d[1]=a[1]; //初始化 21 int len=1; 22 for (int i=2;i<=n;i++) 23 { 24 if (a[i]>=d[len]) d[++len]=a[i]; //如果可以接在len后面就接上 25 else //否则就找一个最该替换的替换掉 26 { 27 int j=upper_bound(d+1,d+len+1,a[i])-d; //找到第一个大于它的d的下标 28 d[j]=a[i]; 29 } 30 } 31 printf("%d\n",len); 32 return 0; 33 }