【17.07%】【codeforces 583D】Once Again...
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array of positive integers a1, a2, …, an × T of length n × T. We know that for any i > n it is true that ai = ai - n. Find the length of the longest non-decreasing sequence of the given array.
Input
The first line contains two space-separated integers: n, T (1 ≤ n ≤ 100, 1 ≤ T ≤ 107). The second line contains n space-separated integers a1, a2, …, an (1 ≤ ai ≤ 300).
Output
Print a single number — the length of a sought sequence.
Examples
input
4 3
3 1 4 2
output
5
Note
The array given in the sample looks like that: 3, 1, 4, 2, 3, 1, 4, 2, 3, 1, 4, 2. The elements in bold form the largest non-decreasing subsequence.
【题目链接】:http://codeforces.com/contest/583/problem/D
【题解】
每次都选出现最多个数的数?
3 4 1 2
难道你要随便选一个数?
显然
12 3 4 4 4 4 4…
更优
其中1、2是在a[1..n]中选的,3、4是在a[n+1..2n]中选的;
当然你也可以这样选
1 2 2 2 2 ….. 2 2 3 4
或
1 2 3 3 3 3 3 3 …. 3 3 3 4
所以不能直接选出现次数最多的数字;
还得用一些“聪明的技巧”
聪明的技巧当然就是DP了;
可以考虑
5 6 3 4 1 2
可以看到;
我们第一次会选 12
第二次会选 3 4
第三次会选 5 6
所以最少把原序列复制6/2==3次才行;
在这n*(n/2)个数字里面进行DP;
那
6 5 4 3 2 1咋办?
这种情况我们完全不用想;
直接随便取一个数字就行了;
然后每次都选那个数字;
又例如
5 6 4 3 2 1
则第一次选5 6 其余的都选6就好:
然后复制6/2==3次完全够了
则进行DP的时候会选出
5 6 6 6
剩余的全部填6;
又例如
5 5 6 4 3 2 1
进行6/2==3次DP
会选出
5 5 5 5 5 5 6
其他的每次都选两次5选在最前面就好;
即我们选择的出现次数最多的数字是肯定有地方放的;所以不用担心;
总结一下就是
把n个数字复制n/2次;然后对这n*(n/2)个数字进行DP;求出这n*(n/2)个数字的最长不下降子序列;
(求n*(n/2)个数字的最长不下降子序列的时候只要往前找n个位置更新f[i]就可以了,具体的自己想,很简单的);
然后在初始的n个数字中选择出现次数最多的数字的次数key;
答案就是DP算出来的最长+(t-(n/2))*key
如果n==1要特判下,不然会搞笑.
【完整代码】
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5010;
int n,t,a[MAXN],lim,f[MAXN],ans = 0,mf = 0,b[350] = {0};
int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%d",&n,&t);
for (int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
mf = max(mf,b[a[i]]);
}
lim = n*min(n/2,t);
if (n==1)
lim = n;
for (int i = n+1;i <= lim;i++)
a[i] = a[i-n];
for (int i = 1;i <= lim;i++)
{
f[i] = 1;
for (int j = 1;j <= i-1;j++)//faster algorithm ->for (int j = max(1,i-n);j<=i-1;j++)
if (a[j] <= a[i])
f[i] = max(f[i],f[j]+1);
ans = max(ans,f[i]);
}
if (n==1)
n++;
if (t <= (n/2))
printf("%d\n",ans);
else
printf("%d\n",ans+(t-(n/2))*mf);
return 0;
}
【17.07%】【codeforces 583D】Once Again...的更多相关文章
- 【黑金教程笔记之008】【建模篇】【Lab 07 数码管电路驱动】—笔记
实验七的目的是设计实现最大为99数字在2个数码管上.采用同步动态扫描.即行信号和列信号同步扫描.这里数码管是共阳极的.选择端口也是共阳极的. 模块: /************************ ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【24.17%】【codeforces 721D】Maxim and Array
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【15.07%】【codeforces 625A】Guest From the Past
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- 【42.07%】【codeforces 558A】Lala Land and Apple Trees
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【40.17%】【codeforces 569B】Inventory
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces】【比赛题解】#855 Codefest 17
神秘比赛,以<哈利波特>为主题……有点难. C题我熬夜切终于是写出来了,可惜比赛结束了,气啊. 比赛链接:点我. [A]汤姆·里德尔的日记 题意: 哈利波特正在摧毁神秘人的分灵体(魂器). ...
- 【codeforces 514D】R2D2 and Droid Army
[题目链接]:http://codeforces.com/contest/514/problem/D [题意] 给你每个机器人的m种属性p1..pm 然后r2d2每次可以选择m种属性中的一种,进行一次 ...
- 【codeforces 799D】Field expansion
[题目链接]:http://codeforces.com/contest/799/problem/D [题意] 给你长方形的两条边h,w; 你每次可以从n个数字中选出一个数字x; 然后把h或w乘上x; ...
随机推荐
- JVM route
http://www.linuxidc.com/Linux/2013-06/86446.htm
- Android Material风格的应用(五)--CollapsingToolbar
Collapsing Toolbar Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewA ...
- POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束
POJ 1201 http://poj.org/problem?id=1201 题目大意: 有一个序列,题目用n个整数组合 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai, ...
- 在Qtcreator中,KDE的Hello World(安装kdelibs5-dev)
我刚开始为KDE编程,我面临的问题是我不知道KDE项目的pro文件是什么,我有一个想法. 我还尝试了 file: 库 += -lkdeui 我还是找不到KApplication的问题 代码 main. ...
- js实现第一次打开网页弹出指定窗口(常用功能封装很好用)
js实现第一次打开网页弹出指定窗口(常用功能封装很好用) 一.总结 1.常用功能封装:之前封装的cookie的操作函数非常好用,我自己也可以这么搞 二.js实现第一次打开网页弹出指定窗口 练习1:第一 ...
- ARM+linux学习过程(2)安装vmware-tool过程与错误解决
安装: 点击Ubuntu VMware菜单的-VM-Install VMware Tools 这时,在Ubuntu下会自动加载Linux版的VMware Tools的安装光盘镜像.你会看到虚拟机的桌面 ...
- 【a903】石子归并
Time Limit: 10 second Memory Limit: 2 MB 问题描述 在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相 ...
- ASIC DC综合的理解
ASIC DC综合的理解 DC综合流程 输入设计文件+指定的工艺库文件+约束文件 经过DC的综合,输出满足期望的门级网表及综合报告 输入输出数据 输入文件:设计文件(verilog等).工艺库(db) ...
- 【u118】日志分析
Time Limit: 1 second Memory Limit: 128 MB [问题描述] M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...
- Windows Phone 8.1 Tiles, Notifications and Action Center
(1)Tiles Tiles 也就是磁贴,是 Windows Phone 的一大特色. 一个 Tile 其实可以看成是一个 XML,比如: <tile> <visual> &l ...