ACM_买粽子(UVA唯一的雪花)
Problem Description:
端午节快到了,小蛋准备到集市上买粽子。于是周六这天,小蛋和舍友搭着公交到了西南市场。说来也怪,这天集市上就只有n个人在卖粽子,整齐地排成一列,而且第i(1<=i<=n)个人前面有Xi个粽子堆在一起。小蛋这人平时很大方,买东西也很讲究,这次就想自掏腰包,准备买很多粽子送给同学和老师们吃。那么问题来了,有n个人在卖粽子,怎么个买法呢?小蛋就想在n个人中连续地选择k个相邻的人买他们全部的粽子,要求所选的这k个连续相邻的人各自卖的粽子数量不能有相同的个数,并且使得k最大。
Input:
输入有多组数据
第一行输入一个整数n(0<n<=100000),表示集市上有n个人在卖粽子。
第二行输入n个整数,第i个数表示第i个人卖的粽子数量Xi(0 < Xi <= 1000)。
Output:
输出符合条件的最大值k,每个输出占一行
Sample Input:
7
3 2 4 1 3 2 3
5
1 6 3 1 2
Sample Output:
4
4
解题思路:滑动窗口,尺取法思想。找到一个最长的连续子序列,使得里面的元素都不相同。set容器维护,时间复杂度是O(nlog(n))。紫书讲得好:假设序列元素从0开始编号,所求连续子序列的左端点为L,右端点为R。从R=0开始不断增加R,相当于把所求序列的右端点往右延伸。当无法延伸(即A[R+1]在子序列A[L~R]中出现过)时,只需增大L,并且继续延伸R。既然当前的A[L~R]是可行解,L增大之后必然还是可行解,所以不必减少R,继续增大即可。
AC代码一之set:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
int n,x[maxn],l,r,ans;set<int> st;
int main(){
while(~scanf("%d",&n)){
for(int i=;i<n;++i)scanf("%d",&x[i]);
l=r=ans=;st.clear();
while(r<n){
while(r<n&&!st.count(x[r]))st.insert(x[r++]);
ans=max(ans,r-l);
st.erase(x[l++]);
}
printf("%d\n",ans);
}
return ;
}
AC代码二之map:思路和操作跟上面一样,非常巧妙地处理了区间中不同元素的下标。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
int n,l,r,ans,x,last[maxn];map<int,int> cur;
int main(){
while(~scanf("%d",&n)){
memset(last,,sizeof(last));cur.clear();
for(int i=;i<n;++i){
scanf("%d",&x);
if(!cur.count(x))last[i]=-;///如果还没出现,则标记为-1
else last[i]=cur[x];///否则记录上一次出现的下标
cur[x]=i;///更新当前x的坐标
}
l=r=ans=;
while(r<n){
while(r<n&&last[r]<l)r++;///如果当前last[r]!=l说明该区间中所有元素都不同,则继续向右延伸r,否则l++,即左端点向右蠕动
///cout<<l<<endl;
ans=max(ans,r-l);
l++;
}
printf("%d\n",ans);
}
return ;
}
/*
i 0 1 2 3 4 5 6
A[i] 3 2 4 1 3 2 3
last[i] -1 -1 -1 -1 0 1 4
*/
ACM_买粽子(UVA唯一的雪花)的更多相关文章
- Uva 11572 唯一的雪花
题目链接:https://uva.onlinejudge.org/external/115/11572.pdf 题意:找到一个尽量长的连续子序列 Al ~ AR ,使得该序列没有相同的元素. 分析:枚 ...
- UVa 11572 唯一的雪花(滑动窗口)
https://vjudge.net/problem/UVA-11572 题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列,使得该序列中没有相同的元素. 思路:很简单的题,也没啥好解释的了. ...
- UVa 11572 唯一的雪花(优化策略)
题目描述: 输入一个长度为n(n<=1000000)的序列A, 找到一个尽量长的连续子序列A(L)-->A(R),是的该序列中没有相同的元素. 输入: T:代表组数 n:代表有n个数 这一 ...
- UVA - 11572 Unique Snowflakes(唯一的雪花)(滑动窗口)
题意:输入一个长度为n(n <= 10^6)的序列A,找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同的元素. 分析: 法一:从r=0开始不断增加r,当a[r+1]在子序列a[l~r] ...
- 全局唯一Id:雪花算法
雪花算法-snowflake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有 ...
- [ACM_水题] UVA 11729 Commando War [不可同时交代任务 可同时执行 最短完成全部时间 贪心]
There is a war and it doesn't look very promising for your country. Now it's time to act. You have a ...
- [ACM_水题] UVA 11292 Dragon of Loowater [勇士斗恶龙 双数组排序 贪心]
Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shor ...
- [ACM_水题] UVA 12502 Three Families [2人干3人的活后分钱,水]
Three Families Three families share a garden. They usually clean the garden together at the end o ...
- 集训第四周(高效算法设计)K题 (滑窗问题)
UVA 11572 唯一的雪花 题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新 方法一: #include& ...
随机推荐
- js生成web安全色
256色里有40种颜色在Macintosh和Windows里显示的效果不一样,所以能安全使用的只有216色. <!DOCTYPE HTML> <html> <head&g ...
- BZOJ 1631 Usaco 2007 Feb. Cow Party
[题解] 最短路裸题.. 本题要求出每个点到终点走最短路来回的距离,因此我们先跑一遍最短路得出每个点到终点的最短距离,然后把边反向再跑一遍最短路,两次结果之和即是答案. #include<cst ...
- 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser
[链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...
- 像 IDE 一样使用 vim
本文转载自:https://github.com/yangyangwithgnu/use_vim_as_ide ##[目录] 0 vim 必知会........0.1 .vimrc 文件....... ...
- R语言为数据框添加列名或行名
1.添加列名 wts=c(1,1,1) names(wts)=c("setosa","versicolor","virginica") 2. ...
- route 详解
语法: [root@test root]# route [-nee] [root@test root]# route add [-net|-host]目标主机或网域[netmask] [gw|dev] ...
- javax ee常用类
1.public interface HttpServletRequest extends ServletRequest 都在package javax.servlet.http;包下 接口继承接口p ...
- Linux: 统计代码行数和SVN修改行数的命令
Mac下同样有效. 1. 统计目录下所有js文件的代码行数. find . -name '*.js' | xargs wc -l 2. 统计SVN的修改行数. svn diff -rBeginRev: ...
- Bootstrap:解决Bootstrap下拉框需要双击才能打开的问题
当使用AngularJS和Bootstrap时,会发生菜单栏navbar控件 需要点击两下才能打开的问题.解决的方法就是在页面加载后,执行如下语句: // 防止下拉菜单需要双击的bug $('.dro ...
- [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
在看完<Objective-C 程序设计 第6版>之后,看了一些关于iOS开发职位的面试题,发现自身基础非常是不牢,于是打算以查缺补漏的方式阅读还有一本关于Objective-C的基础书籍 ...