Thinking about it:

  我的思路跟sliding window有点类似。假设已经确定了一个区间[l, r],序列中从 l 到 r 恰好包含了[1, K]的各个元素,则从 r 开始继续迭代序列的各个位置,如果发现了1到K的数,则做以下处理:

  如果 这个数 刚好是 l 位置上的数,那么就意味着这个区间可能缩短,则同时更新 l 和 r,计算区间长度的变化。

  如果 这个数 不是 l 上的数,那么即使 更新了 r 那也不能使答案更好,所以可以不做处理。

  那么第一个符合条件的[l, r]可以直接迭代得出,如果迭代一次都不能发现[1, K]的各个数,那么这个序列肯定是不能满足的要求。

PS:

  虽然AC了这题,但是感觉对这道题的题解表述上还有些欠缺。

Code:

/**
* AC @ Sep 11th 2015
* Run Time : 0.739s
*/
#include <bits/stdc++.h> using namespace std; const int MAXN = 1000 + 50;
int var[MAXN*1000];
int Case = 0;
int N, M, K; void init() {
for (int i = 1; i <= 3; ++i) {
var[i] = i;
}
int sum = 6;
for (int i = 4; i <=N ; ++i) {
var[i] = sum % M + 1;
sum -= var[i-3];
sum += var[i];
}
} void done() {
int pos[MAXN] = {0};
int counter = 0;
for (int i = 1; i <= N && counter < K; ++i) {
if (var[i] >= 1 && var[i] <= K && !pos[var[i]]) {
++ counter;
}
pos[var[i]] = max(pos[var[i]], i);
}
if (counter < K) {
cout << "Case " << (++Case) << ": sequence nai" << endl;
return ;
}
int minPos = MAXN * 1000, maxPos = -1;
for (int i = 1; i <= K; ++i) {
minPos = min(minPos, pos[i]);
maxPos = max(maxPos, pos[i]);
}
int ans = maxPos - minPos + 1;
for (int i = 1; i <= N; ++i) {
if (var[i] >= 1 && var[i] <= K) {
if (pos[var[i]] == minPos || pos[var[i]] == maxPos || i > maxPos) {
pos[var[i]] = i;
minPos = MAXN * 1000, maxPos = -1;
for (int j = 1; j <= K; ++j) {
minPos = min(minPos, pos[j]);
maxPos = max(maxPos, pos[j]);
}
ans = min(ans, maxPos - minPos + 1);
}
}
}
cout << "Case " << (++Case) << ": " << ans << endl;
} void work() {
cin >> N >> M >> K;
init();
done();
} int main(int argc, char const *argv[]) {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T --) {
work();
}
return 0;
}

  

  

uva11536 Smallest Sub-Array的更多相关文章

  1. [Javascript] Implement zip function

    1. Use a for loop to traverse the videos and bookmarks array at the same time. For each video and bo ...

  2. 《Algorithms Unlocked》读书笔记2——二分查找和排序算法

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...

  3. T - Posterized(贪心思维)

    Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...

  4. CF980C Posterized 贪心 二十五

    Posterized time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  5. Arrange an Array to Form a Smallest Digit

    /** * Input an array of positive integers, arrange the integers to form new digits, * and output the ...

  6. [Algorithm] Find Nth smallest value from Array

    Q1: Find the smallest value from array: function findMin(arr) { let min = arr[0]; for (let i = 1; i ...

  7. 41.把数组排成最小的数[Sort array to smallest value]

    [题目] 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{3,32,  321},则输出这两个能排成的最小数字321323.请给出解决问题的算法,并证明该 ...

  8. Kth Smallest Element in Unsorted Array

    (referrence: GeeksforGeeks, Kth Largest Element in Array) This is a common algorithm problem appeari ...

  9. luogu题解 UVA11536 【Smallest Sub-Array】最短set区间&滑动窗口

    题目链接: https://www.luogu.org/problemnew/show/UVA11536 题目大意: 给定一个\(N,M,K\),构造这样的数列: \(x[1]=1,x[2]=2,x[ ...

随机推荐

  1. 设置从本地copy文件到远程计算机上

    1.运行中输入mstsc.exe调出远程连接桌面,点击选项 2.在“本地资源”选项卡点击“详细信息” 3.勾选“智能卡”下的“驱动器” 4.设置好后,远程计算机就可以复制,粘贴了

  2. 实现一个简单的邮箱地址爬虫(python)

    我经常收到关于email爬虫的问题.有迹象表明那些想从网页上抓取联系方式的人对这个问题很感兴趣.在这篇文章里,我想演示一下如何使用python实现一个简单的邮箱爬虫.这个爬虫很简单,但从这个例子中你可 ...

  3. Oracle的字符替换函数translate用法

    参考文档如下:http://www.banping.com/2009/05/18/oracle_function_translate/ Oracle提供了一个字符替换函数translate,不同于re ...

  4. 关于Oracle将小于1的数字to_char后丢掉0的解决办法

    SQL代码如下: select rtrim(to_char(0.11, 'fm9990.99'), '.') from dual;其中0.11为需要to_char的数字fm去掉字符串前面的空格9990 ...

  5. 3n+1

    #include<iostream> using namespace std; int main() { int n; while(cin>>n) { int count=0; ...

  6. Nginx +iis反向代理

    一:简介      Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所 ...

  7. MySQL zerofill 的用法

    creata table t(x int(6) zerofill,y int); insert into t(x,y) values(1,1); select x,y from t;

  8. qcow2、raw、vmdk等镜像格式

    转自 http://www.prajnagarden.com/?p=248 http://blog.csdn.net/starshine/article/details/8179483 转者言:对pr ...

  9. Linux 电子书共享下载--大家一起学习

    文件名 大小 时间 到期时间 操作    鸟哥私房菜(全集).pdf 36.57 MB 2 小时前 免费永久       练成Linux高手.chm 3.76 MB 2 小时前 免费永久        ...

  10. java的数学函数总结

    java的数学函数都放在java.lang这个包中,并且这些函数的方法在类Math中是作为static方法出现的,所以要引用一个特定的函数,只需将类Math和一个圆点写在要使用的方法前就好.如方法sq ...