例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. JAVA 锁的终极状态

    自旋锁 背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成:并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得. 原理:当一条线 ...

  2. Java设计模式的7种设计原则还有很多人不知道

    前言 其实没有设计模式我们也能完成开发工作.但是为什么需要设计模式呢?让你看起来很牛,没错这个算一个.让你的代码层次感分明,可读性强而且容易维护.让你像我一样有更多的摸鱼划水时间. 可能有人说我一个类 ...

  3. 手动启动Oracle服务的.bat文件

    Oracle数据库的基本服务会占用很大的内存,有的程序员会在不用的时候Oracle服务关闭来减少对电脑内存资源的占用. 我在这准备了一个可以开启/关闭Oracle服务的bat文件,希望被采纳!!! 新 ...

  4. 什么是Java优先级队列?

    PriorityQueue是基于无界优先级队列和优先级堆构建的重要Java API之一.本文通过适当的代码示例深入了解了有关此API及其用法的一些复杂信息.另在上篇文章中我们简单地谈了下Java编译器 ...

  5. python GUI编程tkinter示例之目录树遍历工具

    摘录 python核心编程 本节我们将展示一个中级的tkinter应用实例,这个应用是一个目录树遍历工具:它会从当前目录开始,提供一个文件列表,双击列表中任意的其他目录,就会使得工具切换到新目录中,用 ...

  6. 单片机内核Cortex-M3八大知识点

    单片机内核Cortex-M3的八个知识点 1.指令集 32位ARM指令集:对应ARM状态 16位Thumb指令集:对应Thumb状态(是ARM指令集的一个子集)​   指令集演进图 2.BKP备份寄存 ...

  7. 使用 Docker 和 Nginx 打造高性能的二维码服务

    使用 Docker 和 Nginx 打造高性能的二维码服务 本文将演示如何使用 Docker 完整打造一个基于 Nginx 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...

  8. 【红宝书】第20章.JSON

      JSON是一种轻量级的数据格式.JSON使用JS语法的子集表示对象.数组.字符串.数值.布尔值和null,不支持undefined JSON.stringify() // JSON.stringi ...

  9. 2019年腾讯PHP程序员面试题目分享

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com 1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除 ...

  10. fastjson又被发现漏洞,这次危害可能会导致服务瘫痪

    0x00 漏洞背景 2019年9月5日,fastjson在commit 995845170527221ca0293cf290e33a7d6cb52bf7上提交了旨在修复当字符串中包含\\x转义字符时可 ...