码迷,mamicode.com
首页 > 其他好文 > 详细

【JZOJ 5048】【GDOI2017模拟一试4.11】IQ测试

时间:2020-02-26 19:00:31      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:can   i++   删除   inline   png   put   指针   scanf   cpp   

题目大意:

判断一个序列是否是另外一个序列删除若干个数字之后得到的。

正文:

我们可以定义两个指针,分别指向长序列和短序列。

拿样例来举例:

技术图片

如果指针指的数相同,两个指针都往右跳:

技术图片

技术图片

如果不同,则指向长序列的指针往右跳:

技术图片

以此类推。

超时,得分 \(\texttt{30}\) 分。

考虑将长序列每一个出现过的数的位置存起来,然后用二分找合适的位置。可以用 \(vector\) 来存,再用一个变量 \(last\) 记录短序列每一个数字在长序列出现的位置,二分时就可以找大于上一个数的 \(last\) 的最小的数。

代码:

bool flag = 1;
l = 0;
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
{
    scanf ("%d", &x);
    if(f[x].empty())
        flag = 0;
    if(!flag)
        continue;
    it = upper_bound(f[x].begin(), f[x].end(), l);
    if(it == f[x].end()) flag = 0;
    l = *it; 
}
if(flag) puts("TAK");
else puts("NIE");

【JZOJ 5048】【GDOI2017模拟一试4.11】IQ测试

标签:can   i++   删除   inline   png   put   指针   scanf   cpp   

原文地址:https://www.cnblogs.com/GJY-JURUO/p/12367887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!