题目:传送门

首先输入一个n,之后输入n个数a(1<=a<=1e7),对这n个数排序后,你需要找到所有的它们连续的长度。把这些连续的长度排序后输出

输入

输入:

8

1 5 2 7 4 5 7 1

输出

输出:

1 2 2

样例解析:

将上面数排序得:

1 1 2 4 5 5 7 7

去重后 :

1 2 4 5 7

连续长度:

2 2 1

因为1 2 4之间少一个3去连接,所以1 2和4之间要断开。又因为4 5和7之间少一个6来连接,所以5和7直之间要断开

结果排序后:

1 2 2

题解:

因为n最大是是1e7,而且程序必须在1s内得到答案。所以我们这里肯定要使用O(n)复杂度的木桶排序

对于:1 5 2 7 4 5 7 1 这一组数据

如果使用木桶排序的话数组至少要开到v[9],因为用木桶排序用的数据本身当v数组的下标

    v数组: 0 1 2 3 4 5 6 7 8 9     //数组下标

处理一下v数组: 0 1 1 0 1 1 0 1 0 0     //这里的1代表这个下标在输入的数据中出现过,0代表没有出现过。比如v[2]=1,就表示2这个数在我们输入的数据中

代码:

#include <stdio.h>
#include<string.h>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e7+5;
int v[maxn],w[maxn],p[maxn];
int main()
{
int n,a,maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a);
v[a]=1;
maxx=max(maxx,a);
}
}

这样处理过之后我们发现完成了去重和排序

for(int i=1;i<=maxx;++i)
{
if(v[i]>0)
{
printf("%d ",i);
}
}
printf("\n");

你可以用这个代码把v数组打印出来结果会是1 2 4 5 7

之后我们就要求它的连续长度,这个时候就新定义一个数组w和p

int ans=0,i;
for(i=1;i<=maxx;++i){
if(v[i]){
w[i]=w[i-1]+1;
}
else {
p[w[i-1]]++;
ans=max(ans,w[i-1]); //我们把
}
}
下标 :0 1 2 3 4 5 6 7 8 9
v中的值:0 1 1 0 1 1 0 1 0 0
w初始值:0 0 0 0 0 0 0 0 0 0
处理后w:0 1 2 0 1 2 0 1 0 0
把w[1,7]这个下标内的,所有0之前的值都存起来,因为它就是那个连续长度
2 2 1 这个1不在0之前但是它也是连续长度,我们也要把它取出来
第一个2是{1,2}这两个数的两个数的连续长度。
第二个2是{4,5}这两个数的连续长度
第三个数1是{7}这1个数的连续长度

这样的话,我们就会得到2 2 1这个结果,但是我们还要对它排序后再输出。这里又要用到木桶排序

但是我已经把它们放在木桶p里面了

int ans=0,i;
for(i=1;i<=maxx;++i){
if(v[i]){
w[i]=w[i-1]+1;
}
else { //else就是出现了断点0
p[w[i-1]]++; //把这个数用木桶存起来
ans=max(ans,w[i-1]); //找到这个木桶的右端点 ,以便我们下一步输出的时候去枚举
} //因为木桶排序是把这个数当作下标,所以要找右端点只需要看你需要用到的最大下标是多少
}

下标:      0 1 2 3 4

p初始值:0 0 0 0 0

处理后p:0 1 2 0 0

之后就打印出就可以了,注意格式:

p[w[i-1]]++;
ans=max(ans,w[i-1]); //不加这两行代码的话,这个样例中的1,就会没有放到木桶p中 for(int i=1;i<=ans;++i){
while(p[i])
{
if(i==ans && p[i]==1)
printf("%d\n",i);
else
printf("%d ",i);
p[i]--;
}
}

总代码:用c++格式提交

 1 #include <stdio.h>
2 #include<string.h>
3 #include <iostream>
4 #define INF 0x3f3f3f3f
5 using namespace std;
6 const int maxn=1e7+5;
7 int v[maxn],w[maxn],p[maxn];
8 int main(){
9 //while(1){
10 // memset(w,0,sizeof(w));
11 // memset(v,0,sizeof(v));
12 // memset(p,0,sizeof(p));
13 int n,a,maxx=0;
14 scanf("%d",&n);
15 for(int i=1;i<=n;++i)
16 {
17 scanf("%d",&a);
18 v[a]=1;
19 maxx=max(maxx,a);
20 }
21 int ans=0,i;
22 for(i=1;i<=maxx;++i){
23 if(v[i]){
24 w[i]=w[i-1]+1;
25 }
26 else {
27 //printf("%d**\n",w[i-1]);
28 p[w[i-1]]++;
29 ans=max(ans,w[i-1]);
30 }
31 }
32 p[w[i-1]]++;
33 ans=max(ans,w[i-1]);
34
35 for(int i=1;i<=ans;++i){
36 while(p[i])
37 {
38 if(i==ans && p[i]==1)
39 printf("%d\n",i);
40 else
41 printf("%d ",i);
42 p[i]--;
43 }
44 }
45 // }
46
47 return 0;
48 }

c格式代码:

 1 #include <stdio.h>
2 #include<string.h>
3 #define maxn 10000000+5
4 int v[maxn],w[maxn],p[maxn];
5 int max(int x,int y){
6 if(x>y) return x;
7 else return y;
8 }
9 int main(){
10 int n,a,maxx=0;
11 scanf("%d",&n);
12 for(int i=1;i<=n;++i)
13 {
14 scanf("%d",&a);
15 v[a]=1;
16 maxx=max(maxx,a);
17 }
18 int ans=0,i;
19 for(i=1;i<=maxx;++i){
20 if(v[i]){
21 w[i]=w[i-1]+1;
22 }
23 else {
24 p[w[i-1]]++;
25 ans=max(ans,w[i-1]);
26 }
27 }
28 p[w[i-1]]++;
29 ans=max(ans,w[i-1]);
30
31 for(int i=1;i<=ans;++i){
32 while(p[i])
33 {
34 if(i==ans && p[i]==1)
35 printf("%d\n",i);
36 else
37 printf("%d ",i);
38 p[i]--;
39 }
40 }
41 return 0;
42 }

生成数据的代码:

 1 #include <bits/stdc++.h>
2 #include<fstream>
3 #define INF 0x3f3f3f3f
4 using namespace std;
5 const int maxx=1e7;
6 const int minn=1;
7 const int N=4;
8 int w[maxx+5],p[maxx+5],v[maxx+5];
9 string getname(int i, string a)
10 {
11 stringstream ss;
12 ss << i << a;
13 return ss.str();
14 }
15 int int_rand(int min,int max)
16 {
17 return int(min+rand()%(max-min));
18 }
19 int main(){
20 srand((unsigned)time(NULL)); //随机种子
21 //for(int i=1;i<=N;++i){
22 string name1, name2;
23 //name1 = getname(i, ".in");
24 //name2 = getname(i, ".out");
25 ofstream fp2("1.out", ios::out);
26 ofstream fp1("1.in", ios::out);
27 //fp2.open(name2, ios::out);
28
29 int n=int_rand(minn,maxx),a,maxn=0;
30 //printf("%d\n",n);
31 fp1<<n;
32 fp1<<("\n");
33 for(int i=1;i<=n;++i){
34 a=int_rand(minn,maxx);
35 //printf("%d\n",a);
36 v[a]=1;
37 maxn=max(maxn,a);
38 if(i!=n) {
39 fp1<<a<<" ";
40 }
41 else {
42 fp1<<a<<"\n";
43 }
44 }
45
46 //memset(w,0,sizeof(w));
47 //memset(v,0,sizeof(v));
48 //memset(p,0,sizeof(p));
49 //int a;
50 //for(int i=1;i<=n;++i)
51 //{
52 // scanf("%d",&a);
53 // v[a]=1;
54 // maxx=max(maxx,a);
55 //}
56 int ans=0,i;
57 for(i=1;i<=maxn;++i){
58 if(v[i]){
59 w[i]=w[i-1]+1;
60 }
61 else {
62 p[w[i-1]]++;
63 ans=max(ans,w[i-1]);
64 }
65 }
66 p[w[i-1]]++;
67 ans=max(ans,w[i-1]);
68
69 for(int i=1;i<=ans;++i){
70 while(p[i])
71 {
72 if(i==ans && p[i]==1)
73 fp2<<i<<"\n";//,printf("%d\n",i);
74 else
75 fp2<<i<<" ";//,printf("%d ",i);
76 p[i]--;
77 }
78 }
79
80
81 fp1.close();
82 //fp2.close();
83 // }
84 }

qmh的测试1的更多相关文章

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  4. TechEmpower 13轮测试中的ASP.NET Core性能测试

    应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...

  5. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  6. 渗透测试工具BurpSuite做网站的安全测试(基础版)

    渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...

  7. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  8. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  9. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

随机推荐

  1. upload-labs 1-21关通关记录

    0x01: 检查源代码,发现JS前端验证,关闭JS即可连接,或者手动添加.php,或者上传1.jpg,再抓包修改为php 0X02: if (($_FILES['upload_file']['type ...

  2. 最新详解android自动化无障碍服务accessibilityservice以及高版本问题_1_如何开启获得无障碍

    前言 无障碍服务accessibilityservice是什么 简单来说 无障碍服务就是一个为残障人士 尤其是视觉障碍人士提供的一个帮助服务.具体就是可以识别控件 文字 可以配合语音助手 操作和 使用 ...

  3. 使用sqluldr2进行oracle数据库抽取时执行后无反应,也无日志

    使用sqluldr2进行oracle数据库表数据抽取时遇到执行后无反应,也不报错,也无日志输出的情况. 经过排查之后发现时由于oracle账户密码快要过期导致的(这也能出问题,我服,类似的plsql连 ...

  4. 分布式 ID 生成算法 — SnowFlake

    一.概述 分布式 ID 生成算法的有很多种,Twitter 的 SnowFlake 就是其中经典的一种. SnowFlake 算法生成 ID 的结果是一个 64bit 大小的整数,它的结构如下图: 1 ...

  5. SAP中数据库表长度的界定

    SAP中,如何查看表和关键字的长度?通过SE11菜单栏Extras->table width 可以看到.然而SAP在系统也会将表分类,特别是在可扩展的表维护视图中,分为如下几类      ult ...

  6. Flask扩展点总结(信号)

    信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 根据flask项目的请求流程来进行设置扩展点 1.中间件 from ...

  7. 阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网IP资源,可以绑定到阿里云专有网络VPC类型的ECS、NAT网关、私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS、NAT网关、SLB的解耦,满足灵活管理的要求。阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性络VPC类型的E

    阿里云弹性公网IP那些事 阿里云云栖号 6月1日 弹性公网IP是独立的公网关.私网负载均衡SLB上,并可以动态解绑,实现公网IP和ECS.NAT网关.SLB的解耦,满足灵活管理的要求.

  8. Linux网络数据包的揭秘以及常见的调优方式总结

    https://mp.weixin.qq.com/s/boRWlx1R7TX0NLuI2sZBfQ 作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemon 的形式对外提供 ...

  9. Wireshark抓包参数

    目录 wireshark 抓包过滤器 一.抓包过滤器 二.显示过滤器 整理自陈鑫杰老师的wireshark教程课 wireshark 抓包过滤器 过滤器分为抓包过滤器和显示过滤器,抓包过滤器会将不满足 ...

  10. SpringMVC听课笔记(五:处理模型数据)

    1. Spring MVC 提供了以下几种途径输出数据模型 -- ModelAndView: 处理方法返回值类型为ModelAndView 时,方法体即可通过该对象添加模型数据 -- Map及Mode ...