2016级算法第二次上机-C.AlvinZH的儿时梦想——坦克篇
872 AlvinZH的儿时梦想----坦克篇
思路
简单题。仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过。那么我们只要知道每一行矩形之间的空隙位置就可以了。
如果这里用二维数组记住每一个空隙的位置,一是没有必要,二是记录了还要大量的处理才能得到答案。反正我是没想过要怎么处理。
可以发现,要得到本题的答案,只要找到空隙最多的哪个位置,我们取左边参考点,每一行的空隙位置我们可以记录到同一个数组里,即用A[pos]代表pos位置的直线有多少个空隙。但是发现总长度有点大,用数组是不可能了,有没有什么东西可以存下我这样的数对呢?
答案是map或轻便的pair。map的使用方法之前公邮里给大家发过了,不知道大家有没有好好学习。至于对组(pair),是一个稍微封装了一下的结构体模板,可以花一分钟看一下什么是对组。有着这个这题就简单了,两个值一个记录位置,一个记录出现次数,最后找到最大出现次数,n减去此数便可得到答案。具体可参考参考代码一。
非要这样做吗???我不会STL就做不了?
不是的,为什么非要把那么大的数当做索引呢?我就想把它当做数组的值,那下标是什么呢?答案是从0自增的一个计数变量。即A[cnt]记录空隙出现的位置,我们将它排序一下,相同位置会被放在一起,统计相同值的区间跨度一样可以找到空隙出现次数的最大值。具体见参考代码二。
分析
解法一使用map,时间复杂度将达到 \(O(NMlogNM)\) 。
解法二由于需要手动排序,时间复杂度一样是 \(O(NMlogNM)\) 。
参考代码一
//
// Created by AlvinZH on 2017/10/8.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int n, m, x;
while(~scanf("%d %d", &n, &m))
{
map<int, int> sameSum;//统计相同和的个数
for (int i = 0; i < n; ++i) {
int sum = 0;
for (int j = 0; j < m; ++j) {
scanf("%d", &x);
if(j == m - 1) continue;
sum += x;
sameSum[sum]++;
}
}
int maxSame = 0;
for(map<int, int>::iterator it = sameSum.begin(); it != sameSum.end(); it++)
if(maxSame < it->second) maxSame = it->second;
printf("%d\n", n - maxSame);
}
}
参考代码二
/*
Author: 蒋泳波(41)
Result: AC Submission_id: 343393
Created at: Thu Oct 26 2017 14:48:19 GMT+0800 (CST)
Problem: 872 Time: 106 Memory: 5292
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn],cnt,x,n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
cnt = 0;
for(int i = 1; i <= n; i++)
{
int now = 0;
for(int j = 1; j < m; j++)
{
scanf("%d",&x);
now += x;
a[cnt++] = now;
}
scanf("%d",&x);
}
sort(a,a+cnt);
int last = 0,ans = 0;
a[cnt] = -1;//注意初始化值
for(int i = 1; i <= cnt; i++)
{
if(a[i] != a[i-1])//找到分界位置
{
if(ans < i - last)
ans = i - last;
last = i;
}
}
printf("%d\n",n - ans);
}
return 0;
}
2016级算法第二次上机-C.AlvinZH的儿时梦想——坦克篇的更多相关文章
- 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...
- 2016级算法第二次上机-A.画个圈圈诅咒你
890 画个圈圈诅咒你 思路 简单题.题目中的圆并没有什么实际作用,简化成线段重合问题会更好理解些. 暴力解法:使用双重for循环会T到想哭,记住最直接的方法一般是过不了题的. 解法一:二分查找.空间 ...
- 2016级算法第二次上机-G.ModricWang's Real QuickSort
873 思路 这是一道非常基础的题,目的是帮助大家回顾快排相关的知识.大家完成此题之后应该就对快排有比较深刻的印象了. 对于整个快排的流程,题目描述中已经给了清晰完整的伪代码.需要自己加工的部分就是, ...
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- 2016级算法第二次上机-D.Bamboo的饼干
Bamboo的饼干 分析 从两个数组中各取一个数,使两者相加等于给定值.要注意去重和排序 难度不大,方法很多,基本只要不大于O(n^2 ) 的都可以过.本意想考察二分搜索 还可以借助stl中的map, ...
- 2016级算法第二次上机-B.Bamboo的OS实验
Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所 ...
- 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇
864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...
- 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV
1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...
- 2016级算法期末模拟练习赛-C.AlvinZH的青春记忆II
1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分 ...
随机推荐
- 关于super关键字
1.在Java中,有时会遇到子类中的成员变量或方法与父类中的成员变量或方法同名.此时父类的成员变量或方法就会被隐藏(可以理解为重写),如果还想要使用父类中的这个成员变量或方法,就需要用到super. ...
- java 将一个数组中的值按逆序重新存放,例如,原来顺序为:9,5,7,4,8,要求改为:8,4,7, 5,9。
public class Test3 { public static void main(String[] args) { int[] grade = {87,88,89,98,78}; int m; ...
- Linux静态库与动态库详解
引言 为了代码的复用性和模块化,我们常常使用一些库文件,在Windows操作系统下位.lib .dll作为静态库和动态库的后缀名. 在Linux下,静态链接库名字一般为libabcdef.a,其中ab ...
- HUST软工1501-1503班第4周作业成绩公布
说明 本次公布的成绩为第四周作业的结果: 第4周小组作业:WordCount优化 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第4周在线答疑区发帖申诉. 或直接在博客园本帖中进行评论进行申诉 ...
- 4.4.3 Java中的指针:Unsafe类
java多线程编程的无锁CAS底层都是通过 Unsafe进行操作的:源码如下 public final boolean compareAndSet(int expect, int update) { ...
- (转) c/c++调用libcurl库发送http请求的两种基本用法
libcurl主要提供了两种发送http请求的方式,分别是Easy interface方式和multi interface方式,前者是采用阻塞的方式发送单条数据,后者采用组合的方式可以一次性发送多条数 ...
- javascript总结47: JS动画原理&jQuery 效果- 各种动画
1 动画的原理就是: 盒子本身的位置+步长 2 什么是步长? var box=document.getElementById('box'); btn.onclick = function() { // ...
- strerror线程安全分析
导读 strerror是否线程安全了? 1 errno是否线程安全? 1 附1:strerror源码 2 附2:__strerror_r源码 2 strerror是否线程安全了? 答案是NO,但它有个 ...
- [LintCode笔记了解一下]80.Median
Given a unsorted array with integers, find the median of it. A median is the middle number of the ar ...
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
上篇文章讲解了SpringCloud组件和概念介绍,接下来讲解一下SpringCloud组件相关组件使用.原理和每个组件的作用的,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix ...