uva 11536 - Smallest Sub-Array

题目大意:按照题目中的要求构造出一个序列,找出最短的子序列,包含1~k。

解题思路:先根据题目的方法构造出序列,然后用Towpointer的方法,用v[i]来记录当前[l, r]中有几个i;当r移动时,出现v[i] == 1时, c++(用来记录有几个1~k的数字);当c == k 时,就要移动l,当出现v[i] == 0时,c--。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int N = 1000005;
 8
 9 int n, m, k, v[N], g[N];
10
11 void init()
12 {
13     memset(g, 0, sizeof(g));
14     memset(v, 0, sizeof(v));
15
16     cin >> n >> m >> k;
17     g[1] = 1, g[2] = 2, g[3] = 3;
18     for (int i =4; i <= n; i++)
19         g[i] = (g[i-1] + g[i-2] + g[i-3]) %m + 1;
20 }
21
22 bool solve()
23 {
24     int l =1, r = 1, c = 0;
25     int ans = n + 1;
26     while (r <= n)
27     {
28         int t = g[r++];
29         v[t]++;
30         if(t <= k && v[t] == 1) c++;
31
32         while (l < r && c == k)
33         {
34             ans = min(ans, r - l);
35             t = g[l++];
36             v[t]--;
37             if(t <= k && v[t] == 0) c--;
38         }
39     }
40     if(ans <= n)
41     {
42         printf("%d\n", ans);
43         return false;
44     }
45     return true;
46 }
47
48 int main()
49 {
50     int cas;
51     cin >> cas;
52     for (int i = 1; i <= cas; i++)
53     {
54         init();
55         printf("Case %d: ", i);
56
57         if(solve()) printf("sequence nai\n");
58     }
59     return 0;
60 }

感觉代码好没有随和感,-:D

能不能像这样用set来求解呢?

似乎不能,那其他的方法呢?

时间: 2024-11-05 21:19:22

uva 11536 - Smallest Sub-Array的相关文章

UVa 11536 Smallest Sub-Array (水题, 滑动窗口)

题意:给定 n 个由0~m-1的整数组成的序列,输入 k ,问你找出连续的最短序列,使得这个序列含有1-k的所有整数. 析:这个题,很简单么,只要从头开始扫一遍就OK,时间复杂度为O(n). 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #inclu

【最小矩形面积覆盖:凸包+旋转卡壳】UVA 10173 Smallest Bounding Rectangle

[最小矩形面积覆盖:凸包+旋转卡壳]UVA 10173 Smallest Bounding Rectangle 题目链接:UVA 10173 Smallest Bounding Rectangle 题目大意 给你n个点,求能够覆盖所有点集的最小矩形面积. 笔者的第2道凸包题目,凸包 + 旋转卡壳,实现点集的最小矩形面积覆盖问题 ">=0"写成"<=0"坑了我一下午!QAQ 说一下思路 ①Graham's Scan法构建凸包,时间复杂度O(nlogn) ②

UVA.11997- K Smallest Sums, OJ4TH.368 - Magry&#39;s Sum I

感谢算法助教们给了这么一个好题... 题意: 给出n个数组,每个数组有n个元素,我们从每个数组中挑选一个元素,共计n个元素求和,得到共计 $ k^k $ 种sum,求sum中的最小n个值. 利用二分查找符合条件的最大sum值,dfs搜索判断二分条件.最坏时间复杂度 $O(n^{2}log(n*Max(a[i][j])) $ 刘汝佳训练指南上给出了优先队列多路归并的思想. 思路1代码: 1 #include<cstdio> 2 #include<iostream> 3 #includ

uva 12307 - Smallest Enclosing Rectangle(旋转卡壳)

题目链接:uva 12307 - Smallest Enclosing Rectangle 两组踵对点围成长方形,枚举出所有可行长方形维护最小值. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <complex> #include <algorithm> using namespace std; typedef pair

【习题 8-17 UVA - 11536】Smallest Sub-Array

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2.(如果还能有1..k这些数字的话. 所以有1..k这些数字之后.就让左端点尽可能往右. 然后尝试更新答案. 然后让右端点右移. 重复上述过程. [代码] #include <bits/stdc++.h> #define ll long long #define rep1(i,a,b) for (

此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle

Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a program that computes the area of their smallest bounding rectangle (smallest rectangle containing all the given points). Input The input le may contain

UVA 12386 Smallest Polygon n个点的任意多边形求最小周长 科学的暴力

题目链接: 题意: 给定n个点,用n个点组成的多边形中(可以是凹多边形,但n个点一定要全在多边形上) 在所有能由n个点构成的多边形中 求最小面积的多边形的周长 - 最小周长. 思路: 首先我们选择一个定点,则接下来的数进行一个排列,有(n-1)!个排列. 这个序列相邻两个数之间有一条线段. 判断多边形合法:任意两条线段不相交即可.n^2 剩下就是简单的更新答案了. 所以复杂度是 ( n-1 ) ! * n*n #include <cstdio> #include <cstring>

UVA 12300 - Smallest Regular Polygon(计算几何)

思路:找对点最优,奇数情况下,半径要另外算 大概这么一个图,偶数就是距离的一半,奇数的话,做一个正2N边形,那么半径就可以利用三角函数算出来了 然后有了外切圆半径,就能算面积了,为sin(2pi / n) * r * r * n / 2 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double

11536 - Smallest Sub-Array(滑动窗口)

该题其实就是lrj讲的滑动窗口的一个小小变形, 只不过这个窗口的大小是可变的 .  具体方法其实和例题Shuffle类似,用首尾两个指针维护窗口,用一个数组cnt记录1~k中每个数字在窗口中出现的次数,用一个变量c记录窗口中只出现了一次的数字的个数 .   这样只要c == k 这就是一个满足条件的答案,取最小答案即可 . 由于每个元素都只插入删除一次,所以时间复杂度为O(n). 该算法还有一个名字叫"取尺法" ,特点是处理一段长度未知的连续区间,通过反复地推进区间的开头和末尾 ,直到