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. Archlinux 安装配置指导 2015-05-24

    因为用的Linode VPS的系统是Archlinux的,想在本地弄个系统做测试用,这样比较方便.然后发现自己在6年前做的一个Archlinux 安装配置Flash,好怀念的赶脚. 时过进迁,没想到A ...

  2. HTML5 file api读取文件的MD5码工具

    1.工具的用途:用HTML5 file api读取文件的MD5码.MD5码在文件的唯一性识别上有很重要的应用,业内常用MD5进行文件识别.文件秒传.文件安全性检查等: 2.适用性:IE.Chrome皆 ...

  3. 搭建Hadoop集群 (二)

    前面的步骤请看  搭建Hadoop集群 (一) 安装Hadoop 解压安装 登录master, 下载解压hadoop 2.6.2压缩包到/home/hm/文件夹. (也可以从主机拖拽或者psftp压缩 ...

  4. Mac 10.7.*安装XCode3.2.6的方法

    1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...

  5. 星际反作弊2.3for-win7-xp-win8-win10

    星际反作弊2.3for-win7-xp-win8-win10 下载地址 http://wj800.com/rar/scfzb.zip

  6. 树莓派读取DHT11传感器的源代码

    import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 def getval(owpin): tl=[] #存放每个数据位的时间 tb=[] #存放数据位 gpio ...

  7. BOM 浏览器对象模型学习

    window对象属性 innerWidth/innerHeight 浏览器窗口的内部宽度与高度 outerWidth/outerHeight 浏览器的外部宽度与高度 length window.fra ...

  8. RequireJS 和 SeaJS

    RequireJS SeaJS CMD规范 CommonJS的规范: 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的 ...

  9. SQL Server 数据库所有者

    1. 数据库所有者应当永远是 sa 用户 2. 改变数据库的所有者 alter authorization on database :: databaseName to sa; -- 这一句话把数据库 ...

  10. 监控Informix-Url

    jdbc:informix-sqli://[{ip-address|host-name}:{port-number|service-name}][/dbname]: INFORMIXSERVER=se ...