例19   欢乐的跳

题目描述

一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对值分别为:3,2,1。

给定一个数组,你的任务是判断该数组是否符合“欢乐的跳”。

输入格式

每组测试数据第一行以一个整数n(1≤n≤1000)开始,接下来n个空格隔开的整数。

输出格式

对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出"Jolly",否则输出"Not jolly"。

输入样例 #1

4 1 4 2 3

输出样例 #1

Jolly

输入样例 #2

5 1 4 2 -1 6

输出样例 #2

Not jolly

(1)编程思路。

为了判断数组两个连续元素之间差的绝对值是否包括了[1,n-1]之间的所有整数,定义一个数组int hash[1001],其中hash[i]=0表示整数i未出现,hash[i]=1表示整数i出现过。初始时,hash数组的全部元素值均为0。

对n个元素的数组a,用循环for (i=1;i<n;i++)对数组中连续两个元素的差的绝对值d(d=abs(a[i]-a[i-1]))进行处理。若差的绝对值d小于n,则置hash[d]=1,表示整数d出现了。

之后,判断数组hash的情况,若数组元素hash[1]~hash[n-1]的值全为1,则表示数组a中两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数。

(2)源程序。

#include <stdio.h>

#include <math.h>

int main()

{

int hash[1001]={0},a[1001],n,i,d;

scanf("%d",&n);

for (i=0;i<n;i++)

scanf("%d",&a[i]);

for (i=1;i<n;i++)

{

d=abs(a[i]-a[i-1]);

if (d<=n-1) hash[d]=1;

}

for (i=1;i<=n-1;i++)

if (hash[i]==0) break;

if (i<n)

printf("Not jolly\n");

else

printf("Jolly\n");

return 0;

}

习题19

19-1  校门外的树

本题选自洛谷题库 (https://www.luogu.org/problem/P1047)

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有2个整数L((1≤L≤10000)和 M(1≤M≤100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。

接下来的M行每行包含2个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出格式

1个整数,表示马路上剩余的树的数目。

输入样例

500 3

150 300

100 200

470 471

输出样例

298

(1)编程思路。

定义数组int f[10001],其中f[i]=1表示坐标为i的位置有一棵树,f[i]=0表示坐标为i的位置的树被移走了。初始时,数组的元素f[0]~f[l]全部置为1,表示长度为L的马路上每间隔1米有一棵树。

每输入一组区域的起始点和终止点的坐标begin和end,就将f[begin]~f[end]之间的数组元素的值修改为0,表示树被移走了。

最后,统计数组f中值为1的元素的个数,就是马路上剩余的树的数目。

(2)源程序。

#include <stdio.h>

int main()

{

int l,m,begin,end,i,cnt;

int f[10001];

scanf("%d%d",&l,&m);

for (i=0;i<=l;i++)

f[i]=1;

while (m--)

{

scanf("%d%d",&begin,&end);

for (i=begin;i<=end;i++)

f[i]=0;

}

cnt=0;

for (i=0;i<=l;i++)

{

if (f[i]==1)

cnt++;

}

printf("%d\n",cnt);

return 0;

}

19-2  校门外的树(增强版)

本题选自洛谷题库 (https://www.luogu.org/problem/P1276)

题目描述

校门外马路上本来从编号0到L,每一编号的位置都有1棵树。有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B);幸运的是还有植树者每次从编号C到D 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记 1 C D,含C和D);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?

输入格式

第一行L和N,表示校园外原来有L+1棵树,并有N次砍树或种树的操作。

以下N行,砍树或植树的标记和范围,每行3个整数。

L(1 <= L <= 10000)和 N(1 <= N <= 100)

输出格式

共两行。第1行校门外留下的树苗数目,第2行种上又被拔掉的树苗数目。

输入样例

10 3

0 2 6

1 1 8

0 5 7

输出样例

3

2

(1)编程思路。

本题思路与上题类同。同样定义数组int f[10001],其中f[i]=1表示坐标为i的位置有一棵树,f[i]=2表示坐标为i的位置补种了一颗树苗,f[i]=0表示坐标为i的位置的树或树苗被移走了。初始时,数组的元素f[0]~f[l]全部置为1,表示长度为L的马路上每间隔1米有一棵树。

程序中根据砍树或种树的操作对数组f的相应元素进行处理。具体见源程序。

(2)源程序。

#include <stdio.h>

int main()

{

int l,n,m,begin,end,i,cnt1,cnt2;

int f[10001];

scanf("%d%d",&l,&n);

for (i=0;i<=l;i++)

f[i]=1;       // 初始为一棵树

cnt2=0;          // 种上又被砍掉的树苗数

while (n--)

{

scanf("%d%d%d",&m,&begin,&end);

if (m==0)    // 砍树或树苗

{

for (i=begin;i<=end;i++)

{

if (f[i]==2)  cnt2++;   // 树苗被砍掉了

f[i]=0;

}

}

else        // 种树苗

{

for (i=begin;i<=end;i++)

if (f[i]==0)

f[i]=2;

}

}

cnt1=0;         // 留下的树苗数

for (i=0;i<=l;i++)

{

if (f[i]==2)

cnt1++;

}

printf("%d\n%d\n",cnt1,cnt2);

return 0;

}

19-3  珠心算测验

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

输入格式

共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。

第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式

一个整数,表示测验题答案。

输入样例

4

1 2 3 4

输出样例

2

说明/提示

【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。

注意,加数和被加数必须是集合中的两个不同的数。

(1)编程思路。

为了判断集合中有多少个数恰好等于集合中另外两个(不同的)数之和,定义一个数组int hash[10001],其中hash[i]=0表示整数i作为和值未出现,hash[i]=1表示整数i作为和值第1次出现了,hash[i]=2表示整数i作为和值不止1次出现了,只能算一次。初始时,hash数组中,属于集合元素的hash数组相应元素值置1,其余非集合元素的相应hash元素值均为0。

用二重循环

for (i=0;i<n-1;i++)

for (j=i+1;j<n;j++)

对集合中任意两个不同元素的和值t(t=num[i]+num[j])进行处理。若和值t的对应的hash[t]等于1,表示集合中存在元素t为另外两个不同元素的和,计数,同时置hash[t]=2,以避免下次再出现和值t产生重复计数。

(2)源程序。

#include <stdio.h>

int main()

{

int n,i,j,t,cnt=0,num[100];

int hash[10001]={0};

scanf("%d",&n);

for (i=0;i<n;i++)

{

scanf("%d",&num[i]);

hash[num[i]]=1;

}

for (i=0;i<n-1;i++)

for (j=i+1;j<n;j++)

{

t=num[i]+num[j];

if (t<=10000 && hash[t]==1)

{

cnt++;

hash[t]=2;  // 注意:1+4和2+3也算重复,需去掉

}

}

printf("%d\n",cnt);

return 0;

}

C语言程序设计100例之(19):欢乐的跳的更多相关文章

  1. 黑马程序员——经典C语言程序设计100例

    1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...

  2. C语言程序设计100例之(14):丑数

    例14   丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个 ...

  3. C语言程序设计100例之(6):数字反转

    例6    数字反转 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入格式 ...

  4. C语言程序设计100例之(17):百灯判亮

    例17   百灯判亮 问题描述 有序号为1.2.3.….99.100的100盏灯从左至右排成一横行,且每盏灯各由一个拉线开关控制着,最初它们全呈关闭状态.有100个小朋友,第1位走过来把凡是序号为1的 ...

  5. C语言程序设计100例之(25):确定进制

    例25    确定进制 问题描述 6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的.即 6(13)* 9(13)= 42(13),因为,在十三进制中,42 = 4 * 13 + ...

  6. C语言程序设计100例之(22):插入排序

    例22  插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一 ...

  7. C语言程序设计100例之(16):巧解算式

    例16  巧解算式 问题描述 在1.2.3.4.5.6.7.8.9.10个数中间加上加号或减号,使得到的表达式的值为自然数N,如果中间没有符号,则认为前后为一个数,如1 2 3认为是一百二十三(123 ...

  8. C语言程序设计100例之(15):除法算式

    例15   除法算式 问题描述 输入正整数n(2≤n≤68),按从小到大输出所有形如abcde/fghi=n的表达式.其中a~i为1~9的一个排列. 输入格式 每行为一个正整数n (n <= 1 ...

  9. C语言程序设计100例之(9):生理周期

    例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如 ...

随机推荐

  1. 《一头扎进》系列之Python+Selenium框架设计篇1-什么是自动化测试框架-价值好几K的框架,不看别后悔,过时不候

    1. 什么是自动化测试框架 在了解什么是自动化测试框架之前,先了解一下什么叫框架?框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的 ...

  2. JS基础知识点——原始类型和对象类型的区别

    1.js类型 1.1 JavaScript语言规定了7种语言类型,他们分别是: Number(数字) Boolean(布尔值) String(字符串) Null (空) Undefined (未定义) ...

  3. JS基础-事件

    事件机制 事件触发三阶段 事件触发有三个阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往 window 传播,遇到注册的冒泡事件会触发 ...

  4. Kubernetes 应用部署实战

    Kubernetes 应用部署实战 2018-08-08 19:44:56 wuxiangping2017 阅读数 3084  收藏 更多 分类专栏: linux运维与架构师   简介 伙计们,请搬好 ...

  5. PHP函数CURL分别以GET、POST方式请求HTTPS协议接口api

    1.curl以GET方式请求https协议接口 function curl_get_https($url){ $curl = curl_init(); // 启动一个CURL会话 curl_setop ...

  6. springboot-eureka交流机制

    一 前言 这篇文章参考了官方文档,主要是描述了eureka client 和 eureka server 之间的交流机制: peer to peer 的 对等复制交流机制: eureka 官方文档 二 ...

  7. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3

    编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...

  8. Android 音视频技术之录音获取实时音量

    一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...

  9. Android 中 MessageQueue 的 nativePollOnce

    Android SDK 中的事件循环已经是一个老生常谈的问题了, 像 Handler Looper MessageQueue 这几个类也是被大家研究透彻了. 但是再回头看以前自己的分析, 总感觉差点什 ...

  10. 关于svn外网访问的问题-搭建成功

    昨天聊到了svn外网问题.今天,无限查资料,虽然眼累了一些,不过最终实现.还是开心了一下! 背景:本机设置svn服务器,搭建代码库并开设外网 供不再同一地点的他人来访问 上图: 1.svn服务器端 搭 ...