您的位置:首页 > 理论基础 > 计算机网络

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L.The Heaviest Non-decreasing Subsequence Problem

2017-10-07 13:41 507 查看
题目链接:https://nanti.jisuanke.com/t/17319

题目大意:求构成的非递减序列的最大权值

解题思路:trick就是把价值为5的数分成5个价值为1的数,这并不会影响决策,对于负数,直接忽略,因为对结果不产生任何影响,所以直接用LIS

AC代码:

#include<cstdio>
using namespace std;

const int MAXN = 2 * 1000000 + 5;

int gt[MAXN], dp[MAXN];

int binarySearch(int l, int r, int val)
{
int mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (dp[mid] <= val) l = mid + 1;
else r = mid - 1;
}
return l;
}

int toLis(int n)
{
int tot = 0;
dp[tot++] = gt[0];
for (int i = 1;i < n;i++)
{
if (gt[i] >= dp[tot - 1])
dp[tot++] = gt[i];
else
{
int pos = binarySearch(0, tot - 1, gt[i]);
dp[pos] = gt[i];
}
}
return tot;
}

int main()
{
int pos = 0;
for (int tmp;scanf("%d", &tmp) == 1;)
{
if (tmp >= 10000)
for (int i = 1;i <= 5;i++)
gt[pos++] = tmp - 10000;
else if (tmp < 0) continue;
else gt[pos++] = tmp;
}
printf("%d\n", toLis(pos));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐