博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/8660814.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~

1. 自定义排序

第一题是第一行给出n(1<=n<=100),表示下面有n行,每行A(0<=A<24)和B(0<=B<60),表示定的闹钟为AhBmin。

接下来给定X,表示小明从起床到教室需要X分钟,最后一行给出A(0<=A<24)和B(0<=B<60)表示上课时间AhBmin。

求问小明赶在上课前,能够定的最晚闹铃时间为多少,样例保证必定有一个符合要求。

 

 对闹铃排序,按照A从小到大排序,当A相同的时候,B从小到大排序,然后从最后一个往回遍历,找到距离上课时间>=Xmin中的闹铃时间,输出即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
/*
3
5 0
6 0
7 0
59
6 59
*/
using namespace std;
const int maxn=;
struct Node{
int h;
int m;
bool operator<(const Node tmp)const{
if(h==tmp.h)
return m<tmp.m;
else
return h<tmp.h;
}
};
Node clocks[maxn];
int n;
int main()
{
int a,b;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d %d",&clocks[i].h,&clocks[i].m);
}
sort(clocks,clocks+n);
int x;
scanf("%d",&x);
scanf("%d %d",&a,&b);
for(int i=n-;i>=;i--){
if(clocks[i].h>a)
continue;
if(clocks[i].h==a){
if(b-clocks[i].m>=x){
printf("%d %d\n",clocks[i].h,clocks[i].m);
break;
}
}
else{
if(-clocks[i].m+(a-clocks[i].h-)*+b>=x){
printf("%d %d\n",clocks[i].h,clocks[i].m);
break;
}
}
} return ;
}

2. 离散化+二分查找

对于一个矩阵,在坐标系内,左下角坐标(x1,y1),右上角坐标(x2,y2),现在给出n个矩阵的坐标,问重叠区域矩阵最多的个数?如果没有矩阵重叠,输出1。

输入样例,第一行n,接下来分别为n个x1,n个y1,n个x2,n个y2。1<=n<=50,-10^9<=xi,yi<=10^9。

很明显,n的范围只有50,数据量很小,但是x和y很大,需要离散化处理,这样的话最多200个不同的值。

处理之后,对于第i个矩阵,遍历它所在的范围,cnt[i][j]++即可。最后输出cnt最大的那个。如果cnt都为0,即没有矩阵,也就没有重叠,也输出1。

这里注意,一开始我在遍历的时候,下面for循环,起始条件没有+1,这样的话还有10%样例是过不了的。应该是统计边,而不是统计点,因为对于[(0,0),(0,0)]是构不成矩阵的。

for(int k=lx+;k<=rx;k++){
for(int p=ly+;p<=ry;p++){
cnt[k][p]++;
}
}

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
/*
2
0 90
0 90
100 200
100 200
*/
const int maxn=;
int n;
int xx1[maxn],xx2[maxn],yy1[maxn],yy2[maxn];
int idx=;
int a[maxn];
int hash_x[maxn];
int cnt[maxn][maxn]; int binarySearch(int *a,int t,int n){
int l=,r=n-;
int mid;
while(l<=r){
mid=(l+r)>>;
if(a[mid]==t)
return mid;
if(t<a[mid])
r=mid-;
else
l=mid+;
}
return -;
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&xx1[i]);
a[i*+]=xx1[i];
}
for(int i=;i<n;i++){
scanf("%d",&yy1[i]);
a[i*+]=yy1[i];
}
for(int i=;i<n;i++){
scanf("%d",&xx2[i]);
a[i*+]=xx2[i];
}
for(int i=;i<n;i++){
scanf("%d",&yy2[i]);
a[i*+]=yy2[i];
}
//离散化,将-10^9~10^9的数据映射为0~200以内,因为最多出现4*50不同的数,映射值即为索引。
sort(a,a+*n);
hash_x[]=a[];
idx=;
for(int i=;i<*n;i++){
if(a[i]!=a[i-]){
hash_x[idx]=a[i];
idx++;
}
}
memset(cnt,,sizeof(cnt));
for(int i=;i<n;i++){
int lx,ly,rx,ry;
//二分查找对应离散化后的索引。
lx=binarySearch(hash_x,xx1[i],idx);
ly=binarySearch(hash_x,yy1[i],idx);
rx=binarySearch(hash_x,xx2[i],idx);
ry=binarySearch(hash_x,yy2[i],idx);
for(int k=lx+;k<=rx;k++){
for(int p=ly+;p<=ry;p++){
cnt[k][p]++;
}
}
}
int ans=;
for(int i=;i<=idx;i++){
for(int j=;j<=idx;j++){
ans=max(ans,cnt[i][j]);
}
}
if(ans==)
ans=;
printf("%d\n",ans);
return ;
}

3. dfs+剪枝

第一行n和w,接下来有n个零食的重量v[i],0<v[i]<10^9,问你在背包重量为w的情况下,最多能有几种装法?背包重量为0也算一种。

比如说

3 8

1 2 3

因为总的背包容量大于三个总重量,所以三个每个都可选可不选,共计2^3种。

先对零食的重量从小到大排序,然后从最后一个开始,零食索引为idx,背包剩余容量为left,现有方案总数为tot,初始为0。

1. 若idx<=0或者left<=0,表示没得选了,只有就这一种方案,所以tot++即可。

2. 若idx之前所有零食的总重量<=left,那么很显然,该方案数总共为2^idx,加到tot上即可。

3. 若v[idx]<=left,那么我可以放第idx个零食,方案数即为dfs(idx-1,left-v[idx])。

4. 当然不管怎样,我也可以选择不放第idx个零食,方案数即为dfs(idx-1,left)。

注意,因为零食重量的范围,所以代码里的two数组、sum数组、tot为long long,才不会溢出,否则样例会有不过。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
const int maxn=;
int n;
int v[maxn];
long long sum[maxn]; //sum[i]统计v[1]~v[i]的和
int w;
long long tot=;
long long two[]; //two[i]即为2^i值 //dfs搜索所有的方案数
void dfs(int idx,int left){
if(idx<= || left<=){
tot+=;
return;
}
if(sum[idx]<=left){
tot+=two[idx];
return;
}
if(left>=v[idx]){
dfs(idx-,left-v[idx]);
}
dfs(idx-,left);
}
int main()
{
two[]=;
for(int i=;i<=;i++)
two[i]=two[i-]*;
scanf("%d %d",&n,&w);
for(int i=;i<=n;i++){
scanf("%d",&v[i]);
}
sort(v+,v+n+);
sum[]=;
for(int i=;i<=n;i++){
sum[i]=sum[i-]+v[i];
}
dfs(n,w);
printf("%lld\n",tot);
return ;
}

网易2018.03.27算法岗,三道编程题100%样例AC题解的更多相关文章

  1. 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】

    --------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...

  2. 2017 CVTE春招内推专场 C/C++软件开发岗笔试编程题

    先来一波吐槽:选择题全是不定项选择,考的内容在我看来,"反正我接受唔到咯". 比如: 1.Windows操作系统某个通信机制(具体题目忘了,反正答案我选了个熟悉的名词"消 ...

  3. 源代码方式向openssl中加入新算法完整具体步骤(演示样例:摘要算法SM3)【非engine方式】

    openssl简单介绍 openssl是一个功能丰富且自包括的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算. ...

  4. 2018/03/27 每日一个Linux命令 之 cron

    Cron 用于配置定时任务. -- 环境为 Ubuntu16-04 -- 先说说怎么配置一个简单的定时任务.直观的可以看到效果. 之前在网上查找资料,对Shell编程不熟悉的实在是很头疼,走了不少弯路 ...

  5. 2018.03.27 pandas duplicated 和 replace 使用

    #.duplicated / .replace import numpy as np import pandas as pd s = pd.Series([1,1,1,1,1,2,3,3,3,4,4, ...

  6. 2018.03.27 pandas concat 和 combin_first使用

    # 连接和修补concat.combine_first 沿轴的堆叠连接 # 连接concatimport pandas as pdimport numpy as np s1 = pd.Series([ ...

  7. 2018.03.27 python pandas merge join 使用

    #2.16 合并 merge-join import numpy as np import pandas as pd df1 = pd.DataFrame({'key1':['k0','k1','k2 ...

  8. 网易2019校招C++研发工程师笔试编程题

    丰收? (忘了题目了QAQ) 题目描述: 又到了丰收的季节,恰逢小易去牛牛的果园里游玩. 牛午常说他对整个果园的每个地方都了如指掌,小易不太相信, 所以他想考考牛牛. 在果园里有N堆苹果,每堆苹果的数 ...

  9. Python基础编程题100列目录

    实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 实例007:copy 实例008:九 ...

随机推荐

  1. jumpserver堡垒机web终端支持复制粘贴功能

    公司最近内部搭建了一个jumpserver堡垒机,但是web终端连接Windows时候没法复制粘贴文字文本 然后找了一下jumpserver官方说明没找到相应的说明,但是知道是guacamole这个组 ...

  2. VMware导入OVF时报错(未能部署OVF包用户取消了任务的解决办法)

    阅读目录: 1.问题 2.原因 3.解决方案 问题:部署OVF模版的时候报错“用户取消了任务” 原因:导出ovf模板时,虚拟CD-ROM的选项要选[客户端设备],否则导入时报错“用户取消了任务” 解决 ...

  3. nginx 编译安装时的编译参数说明(不建议看)

    https://www.cnblogs.com/wazy/p/8108824.html ./configure --user=www \ #worker进程运行用户 --group=www \ #wo ...

  4. February 4th, 2018 Week 6th Sunday

    Hope clouds observation. 心怀希望会蒙蔽双眼,影响判断. Almost every of us thinks we would be the master of our liv ...

  5. ModelForm 中选择框的数据 以及 instance 参数

    ModelForm 中选择框的数据 print(list(self.fields['customer'].choices)) # [('', '---------'), (1, '张飞'), (2, ...

  6. E - Matrix Power Series (矩阵数列)

    然后,怎么来求这个前k项的和,我把式子推一下 当k为奇数的时候直接SK-1+AK  就又化为偶数的情况了.代码如下: #include<iostream> #include<cstr ...

  7. redis命令大全参考手册

    redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令,并附有解释说明,大家可以收藏.参考,你一定要知道的是:redis的key名要区分大小写,在redi ...

  8. adb报错问题解决方法

    1,报错信息:adb server version (31) doesn't match this client (40); killing 解决方法: 一: 主要是前面的31或者其他,比如32/31 ...

  9. 使用 Apache Web 配置多个站点

    导读 如何在流行而强大的 Apache Web 服务器上托管两个或多个站点.这篇文章的环境是 Fedora 27 虚拟机,配置了 Apache 2.4.29.如果你用另一个发行版或不同的 Fedora ...

  10. Android开发中代码下面出现波浪线问题

    在Android Studio中写代码时,经常会在一个英文单词的下面出现波浪线,这是因为系统检测到你的这个英文单词不符合规范,如下所示: 解决办法:选中这个单词,点击鼠标右键,点击:Spelling ...