受到(一)中启发,现补充字节跳动19年第二次笔试第四题程序。
其中第一部分转载:空气质量题,作者:whl_program
题目如下:
4.一天,小凯同学震惊的发现,自己屋内的PM2.5指标是有规律的!小凯采样了PM2.5的数值,发现PM2.5数值以小时为周期循环,即任意时刻的PM2.5总是和一小时前相等!他的室友小文同学提出了这样一个问题,在t小时内的所有采样点中,选取若干采样点的数值,能否找到一个PM2.5不曾下降过的序列?这个序列最长是多少?
输入描述:
第一行有两个整数n t 表示每小时的采样点个数,和询问多少个小时的结果
第二行有n个整数,以空格分隔,表示一个小时内,每个采样点观测到的PM2.5的数值
示例:
输入
4 3
10 3 7 5
输出
4
说明
3小时内所有采样点为
10 3 7 5 10 3 7 5 10 3 7 5
选取第2 3 5 9个采样点,可以得到一个不曾下降过的序列
3 7 10 10
使用其他的方法也可以得到长为4的满足条件的序列,但无法得到长度超过4的结果
1、采用容器类的方式编写代码,参考以上提到的作者的博文,代码如下:
int main()
{
int a,b;
scanf("%d%d", &a, &b);
vector<int> ans(a, 0),tmp(a,1);
for (int i = 0;i<a;i++)
{
scanf("%d", &ans[i]);
}
for (int i = 1;i<a;i++)
{
for (int j = 0;j<i;j++)
{
if (ans[i]>=ans[j])
{
tmp[i] = max(tmp[i], tmp[j] + 1);
}
}
}
cout << *max_element(tmp.begin(), tmp.end())+b-1;
return 0;
}
2、第二部分-参考(一)种思路,采用数组的形式编写
int main
{
int a[40005];
int d[40005];
int n,t;
scanf("%d",&n);
scanf("%d",&t);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
if (n==0) //0个元素特判一下
{
printf("0\n");
return 0;
}
d[1]=a[1]; //初始化
int len=1;
for (int i=2;i<=n;i++)
{
if (a[i]>=d[len]) d[++len]=a[i]; //如果可以接在len后面就接上
else //否则就找一个最该替换的替换掉
{
int j=upper_bound(d+1,d+len+1,a[i])-d; //找到第一个大于它的d的下标
d[j]=a[i];
}
}
printf("%d\n",len+t-1);
return 0;
}