codeforces 558B. Amr and The Large Array 解题报告
2015-07-16 21:40
295 查看
题目链接:http://codeforces.com/problemset/problem/558/B
题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值。
由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值。因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数。然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值。
赛中短路竟然想不出来~~~泪啊~~泪啊- >_<
题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值。
由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值。因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数。然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值。
赛中短路竟然想不出来~~~泪啊~~泪啊- >_<
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6 + 5; int cnt[maxn]; int pl[maxn]; // 记录每个数第一次出现的位置 int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif // ONLINE_JUDGE int n, a; while (scanf("%d", &n) != EOF) { memset(cnt, 0, sizeof(cnt)); memset(pl, 0, sizeof(pl)); int max_cnt = 0; int min_dis = 0; int l = 0, r = 0; for (int i = 0; i < n; i++) { scanf("%d", &a); if (!cnt[a]) { pl[a] = i; } cnt[a]++; if (max_cnt < cnt[a]) { max_cnt = cnt[a]; l = pl[a], r = i; min_dis = i - tl; } if (max_cnt == cnt[a] && i-pl[a] < min_dis) { min_dis = i - pl[a]; l = pl[a]; r = i; } } printf("%d %d\n", l+1, r+1); } return 0; }
相关文章推荐
- JAVA程序运行时 对象的放置安排及内存的分配
- 【Leetcode】Merge K Sorted Linked List
- openwrt 防火墙设置 一。/etc/config/firewall
- Eclipse如何设置字体
- 微信开发-如何自定义页面分享元素
- 如何获取google Api Key
- Eclipse常用快捷键
- Ant---build.xml
- MiniTwitter记住密码等功能实现
- 暑假集训大一第一周阶段二题目K - 征服的国家
- 58同城Mysql数据库设计原则(转)
- PB与各种数据库连接
- Linux 设备驱动之 UIO 机制(一)
- A Full Hardware Guide to Deep Learning
- Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)
- JS相关方法总计
- linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)
- MyCnCart图片水印
- android拾遗05——摇一摇开发
- HDU 1147 http://acm.hdu.edu.cn/showproblem.php?pid=1147(线段相交模板题)