这道题告诉我想法正确是多么重要,先是我自己想的时候没考虑到最后的页码作为循环的终止,我一直以区间个数来终止循环,这是多么愚蠢啊!然后,我看了别人的代码,但是很不幸超时了!

我自己wa的代码,我感觉很正确就是对不了!


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return (*(int *)a-*(int *)b);
} int main(void)
{
int t,n,i,j,count,k,temp;
int s[5002][2];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&s[i][0],&s[i][1]);
qsort(s,n,sizeof(s[0]),cmp);
count=0;
for(i=0,k=1;i<n&&k<n;)
{
if(s[i][1]>=s[k][1])/*盖住后面的 */
{
k++;
count++;
}
else if(s[i][0]==s[k][0]&&s[i][1]<=s[k][1])/*被后面盖住 */
{
/*如果i被k盖住,说明中间的全部被覆盖了*/
i=k;/*k后移一位,i移到k位置*/
k++;
count++;
}
else
{
i=k;/*k后移一位,i移到k位置*/
k++;
}
}
printf("%d\n",n-count); }
return 0;
}
 

然后我就看网上的算法,然后改了,不过居然超时了

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return (*(int *)a-*(int *)b);
}
int s[][];
int main(void)
{
int t,n,i,j,count,k,temp,end,sta,sum,ma; scanf("%d",&t);
while(t--)
{
scanf("%d",&n); for(i=;i<n;i++)
scanf("%d%d",&s[i][],&s[i][]); qsort(s,n,sizeof(s[]),cmp);
ma=;
end = s[][],sta = s[][];/*得到比较的开始,和结束地址 */
sum = ;/*区间个数从1开始 */
i = ;
while(i<n && s[i][] == sta)/*找到以1为开始区间群中最大那一页页码 */
{
if(end < s[i][]) {
end = s[i][];
ma=i;
} ;
i++;
}
while(end!=n)/*当找到的页码等于最后的页码就可以停止循环 */
{
j=s[ma][];/*得到当前以i为开始区间群中最大的页码 */
sta = end+;/*查找的页码从上一个区间群中的最后一个开始 */
i++;/*获取当前区间群的第一个 */
while(i<n && s[i][] <= sta)/*找打这个区间群中最大的 j*/
{
if(s[i][] > j)
{
j = s[i][];
ma=i;
}
i++;
}
if(j > end)/*如果区间群中最大的大于上一个区间群的最大,那么就需要增加一个了 */
{
sum++;
end = j;
}
}
printf("%d\n",sum); }
return ;
}

最后实在没办法了,只能再找了,终于看到了一个最ok的了,就是在已经排好的区间中找多少个尾部递增序列,很轻松的解决了这题,我靠怎么都没想过这种方法!想法正确真的很重要

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return (*(int *)a-*(int *)b);
}
int s[][];
int main(void)
{
int t,n,i,j,end,sta,sum,p,max; scanf("%d",&t); while(t--)
{
scanf("%d",&end);/*最后的页码号*/ for(i=;i<end;++i)
{
scanf("%d %d",&s[i][],&s[i][]);
} qsort(s,end,sizeof(s[]),cmp); n= ;
p= ;
sum= ; while(sum<=end)
{ max=- ;/*每一次求新递增序列的最大值,这个值就需要初始化*/ for(i=p;i<end;++i)/*循环页码区间,找到连续递增最大的页码*/
{
if(s[i][]<=sum)
{
if((s[i][]>=sum)&&(s[i][]>max))/*更新最大的页码*/
{
max=s[i][] ;
}
}
else /*如果页码递减就跳出*/
break ;
} sum=max+ ;/*在后面递增区间中找出比前一个递增最大值,大1的页码*/
p=i ;/*跳到最大区间后面*/
++n ;/*每一次找新递增序列的最大,就代表前面序列区间内查最大的就可以了,所以加1*/
} printf("%d\n",n); }
return ;
}

zoj 3197 Google Book的更多相关文章

  1. Google, FaceBook, Amazon 加州求职记 (转)

    http://blog.csdn.net/ithomer/article/details/8774006 http://www.myvisajobs.com 一年多前,出于显而易见的原因,下定决心肉身 ...

  2. 九度OJ 1006:ZOJ问题 (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:18621 解决:3197 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下: 1. ...

  3. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  4. linux上使用google身份验证器(简版)

    系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...

  5. Google软件构建工具Bazel原理及使用方法介绍

    近期,Google开源了强大的自动化构建工具Bazel. 正好博主近期在使用china版的Bazel--腾讯自主开发的Blade,所以准备跟大家分享一下Google Bazel这个分布式构建系统的原理 ...

  6. Google Java编程库Guava介绍

    本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(C ...

  7. 序列化笔记之一:Google的Protocol Buffer格式分析

    从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信 ...

  8. [异常解决] How make ubuntu use Google Search

    1.Download the hosts file fromhttps://laod.cn/hosts/2016-google-hosts.html [1] 2.Write a bash shell ...

  9. Google翻译之路

    如何将整个网站都翻译成某种语言,想必大家都有碰到这样的问题吧. 如果能够访问Google的话, 那这个太容易不过了. 来看,下面的就是Google提供的直接翻译某个网站. http://transla ...

随机推荐

  1. 美国地质调研局USGS

    https://lta.cr.usgs.gov/get_data/ http://www.usgs.gov/

  2. ArcGIS Engine DEM拉伸渲染

    从符号库中取出渲染使用的色带对象IColorRamp(也可以自己定义色带内容) <pre name="code" class="csharp">IS ...

  3. Adobe Acrobat XI Pro 官方下载及安装破解

    Adobe公司推出的PDF 格式是一种全新的电子文档格式.借助 Acrobat ,您几乎可以用便携式文档格式 (Portable Document Format ,简称 PDF) 出版所有的文档. P ...

  4. 全排列的hash

    我们经常使用的数的进制为“常数进制”,即始终逢p进1.例如,p进制数K可表示为K = a0*p^0 + a1*p^1 + a2*p^2 + ... + an*p^n (其中0 <= ai < ...

  5. C语言入门(7)——自定义函数

    C源程序是由函数组成的.虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成.函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能.C语言中的函数相 ...

  6. kafka学习(四)-Topic & Partition

    topic中partition存储分布 Topic在逻辑上可以被认为是一个queue.每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里.为了使得 Kafka的吞吐 ...

  7. Android SQLite 事务处理

    应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.我 ...

  8. k8s之scheduler

    一.概述 调度器是kubernetes中独特而又重要的一个模块,独特是因为scheduler是唯一一个以plugin形式存在的组件,重要是因为kubernetes中最重要的基础单元pod的部署是通过s ...

  9. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

  10. vue.js自定义指令入门

    Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为.你可以使用Vue.directive(id, definition)的方法传入指令id和 ...