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的儿时梦想——坦克篇的更多相关文章

  1. 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇

    862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...

  2. 2016级算法第二次上机-A.画个圈圈诅咒你

    890 画个圈圈诅咒你 思路 简单题.题目中的圆并没有什么实际作用,简化成线段重合问题会更好理解些. 暴力解法:使用双重for循环会T到想哭,记住最直接的方法一般是过不了题的. 解法一:二分查找.空间 ...

  3. 2016级算法第二次上机-G.ModricWang's Real QuickSort

    873 思路 这是一道非常基础的题,目的是帮助大家回顾快排相关的知识.大家完成此题之后应该就对快排有比较深刻的印象了. 对于整个快排的流程,题目描述中已经给了清晰完整的伪代码.需要自己加工的部分就是, ...

  4. 2016级算法第二次上机-F.ModricWang's Number Theory II

    891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...

  5. 2016级算法第二次上机-D.Bamboo的饼干

    Bamboo的饼干 分析 从两个数组中各取一个数,使两者相加等于给定值.要注意去重和排序 难度不大,方法很多,基本只要不大于O(n^2 ) 的都可以过.本意想考察二分搜索 还可以借助stl中的map, ...

  6. 2016级算法第二次上机-B.Bamboo的OS实验

    Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所 ...

  7. 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇

    864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...

  8. 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV

    1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...

  9. 2016级算法期末模拟练习赛-C.AlvinZH的青春记忆II

    1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分 ...

随机推荐

  1. Qt自定义插件编程小结

    qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...

  2. libpcap编程实例

    #include <stdio.h> #include <stdlib.h> #include <pcap.h> #include <errno.h> ...

  3. 快速求出n!的质因数的个数

    一般做组合数的题目都要进行质因数的分解,我们一般是for循环对每个数进行质因数分解,大多数情况都不会超时,但极少数的情况下,题目会不允许这样的做法,所以我们需要学会一种更快的方法来求质因数. 我们一般 ...

  4. OracleBulkCopy 修正帮

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Refle ...

  5. [GO]并行和并发的区别

    并行:指在同一时刻,有多条指令在多个处理器上同时执行 并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只有把时 ...

  6. Spring MVC @RequestMapping浅析

    简介:@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapp ...

  7. kalilinux系统设置

    echo LANG="zh_CN.UTF-8" > /etc/default/locale

  8. Word文档发布到CSDN博客

    目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...

  9. lspci通过系统总线查看硬件设备信息

    lspci - 列出所有PCI设备 PCI 的科普: PCI(Peripheral Component Interconnect),是一种连接电子计算机主板和外部设备的总线标准. 常见的PCI卡包括网 ...

  10. zrender源码分析4--初始化Painter绘图模块2

    入口2: 渲染 // zrender_demo.html zr.render(); // zrender.js /** * 渲染 * * @param {Function} callback 渲染结束 ...