Java代码题m个小朋友分糖果,王道论坛研究生机试练习赛(二)

2023-10-15 13:10

本文主要是介绍Java代码题m个小朋友分糖果,王道论坛研究生机试练习赛(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

昨天在微博上看到王道论坛说晚上有机试练习赛(http://ac.jobdu.com/contest.php?cid=1053),想来反正也没什么事,何不参加一下。于是晚上吃完饭回到实验室,等着七点开始做题。练习赛结束了,虽然自己全部AC,但感觉时间花的有点长,主要卡在第三道求公约数个数上。看来自己的数论真的弱爆了。现将自己对这四道解题的看法归纳一下,总的来说题目不算很难,前两道超级水,第三道考素数筛选以及因式分解,第四道动态规划。

一、调整方阵

对应题目1470:http://ac.jobdu.com/problem.php?pid=1470

题目描述:

输入一个N(N<=10)阶方阵,按照如下方式调整方阵:

1.将第一列中最大数所在的行与第一行对调。

2.将第二列中从第二行到第N行最大数所在的行与第二行对调。

依此类推...

N-1.将第N-1列中从第N-1行到第N行最大数所在的行与第N-1行对调。

N.输出这个方阵

输入:

包含多组测试数据,每组测试数据第一行为一个整数N,表示方阵的阶数.

接下来输入这个N阶方阵.

输出:

调整后的方阵

样例输入:

4

3 6 8 7

6 7 5 3

8 6 5 3

9 8 7 2

样例输出:

9 8 7 2

6 7 5 3

3 6 8 7

8 6 5 3

水题,就不多说了。代码

69c5a8ac3fa60e0848d784a6dd461da6.png1 #include

2

3 int data[10][10];4

5 void adjustment(int i,intn);6 intmain()7 {8 intN;9 inti,j;10 while(scanf("%d",&N) !=EOF){11 for(i=0;i

27 void adjustment(int i,intn)28 {29 int max_i =i;30 int j = i+1;31 int temp[10];32 for(;jdata[max_i][i])34 max_i =j;35 if(max_i !=i){36 for(j=0;j

69c5a8ac3fa60e0848d784a6dd461da6.png

二、货币问题

对应题目1549:http://ac.jobdu.com/problem.php?pid=1549

题目描述:

已知有面值为1元,2元,5元,10元,20元,50元,100元的货币若干(可认为无穷多),需支付价格为x的物品,并需要恰好支付,即没有找零产生。

求,至少需要几张货币才能完成支付。

如,若支付价格为12元的物品,最少需要一张10元和一张2元,即两张货币就可完成支付。

输入:

输入包含多组测试数据,每组仅包含一个整数p(1<=p<=100000000),为需支付的物品价格。

输出:

对于每组输入数据,输出仅一个整数,代表最少需要的货币张数。

样例输入:

10

11

13

样例输出:

1

2

3

也是水题吧,有点贪心的思想吧。先尽可能用最大面值,然后依次考虑较小面值。这题如果限制货币的数量的话,应该就是0-1背包问题吧。

代码

69c5a8ac3fa60e0848d784a6dd461da6.png1 #include

2

3 intmain()4 {5 intp;6 inti;7 intsum;8 int money[7] = {1,2,5,10,20,50,100};9 while(scanf("%d",&p) !=EOF){10 sum = 0;11 for(i=6;i>=0;--i){12 sum += (p/money[i]);13 p %=money[i];14 }15 printf("%d\n",sum);16 }17 return 0;18 }

69c5a8ac3fa60e0848d784a6dd461da6.png

三、公约数

对应题目1493:http://ac.jobdu.com/problem.php?pid=1493

题目描述:

给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。

如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。

输入:

输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。

输出:

对于每组测试数据,输出为一个整数,表示a和b的公约数个数。

样例输入:

8 16

22 16

样例输出:

4

2

一直被卡在这道题的超时上。我的做法:采用素数筛选法通过函数computePrime(int n,int

maxC)返回第n个素数,其中只需要判断maxC之前的数,注意为了减少空间,我把所有的偶数(当然除了2)都去掉了,所以flag数组只有总数M的一半。在主函数里,首先求出最大公约数,则公约数的个数就等于这个最大公约数的所有约数个数,然后对这个公约数进行因式分解。即假设最大公约数为maxC,则其因式分解为:

\begin{equation*}maxC=p_1^{x_1}\times p_2^{x_2}\times\cdots\times

p_m^{x_m}\end{equation*}

所以其公约数个数为: $(x_1+1)\times(x_2+1)\times\cdots\times(x_m+1)$,这个好像叫约数个数定理吧。

代码:

69c5a8ac3fa60e0848d784a6dd461da6.png1 #include

2 #include

3

4 #define M 100000000

5 bool flag[M/2];6 int prime[6000000];7 intprimeNum;8

9 int computePrime(int n,intmaxC)10 {11 if(n == 1){12 prime[primeNum++] = 2;13 return 2;14 }15 if(n == 2){16 prime[primeNum++] = 3;17 return 3;18 }19 inti,j;20 intpos;21 i = prime[primeNum-1]+2;22 while(primeNum >1);24 if(!flag[pos]){25 prime[primeNum++] =i;26 j = 3*i;27 while(j<=maxC){28 flag[(j-3)>>1] = 1;29 j += (i<<1);30 }31 }32 i += 2;33 }34 return prime[n-1];35 }36 intmain()37 {38 inta,b;39 intsum;40 intmaxC,i,j;41 primeNum = 0;42 while(scanf("%d%d",&a,&b) !=EOF){43 intt;44 while(a%b != 0){45 t =a;46 a =b;47 b = t%b;48 }49 maxC =b;50 sum = 1;51 i = 0;52 intprime_i;53 while(maxC != 1){54 prime_i = computePrime(i+1,maxC);55 if(maxC %prime_i)56 ++i;57 else{58 t=0;59 while(maxC%prime_i == 0){60 ++t;61 maxC /=prime_i;62 }63 sum *= (t+1);64 ++i;65 }66 }67 printf("%d\n",sum);68 }69 return 0;70 }

69c5a8ac3fa60e0848d784a6dd461da6.png

四、分糖果

对应题目1550:http://ac.jobdu.com/problem.php?pid=1550

题目描述:

给从左至右排好队的小朋友们分糖果,

要求:

1.每个小朋友都有一个得分,任意两个相邻的小朋友,得分较高的所得的糖果必须大于得分较低的,相等则不作要求。

2.每个小朋友至少获得一个糖果。

求,至少需要的糖果数。

输入:

输入包含多组测试数据,每组测试数据由一个整数n(1<=n<=100000)开头,接下去一行包含n个整数,代表每个小朋友的分数Si(1<=Si<=10000)。

输出:

对于每组测试数据,输出一个整数,代表至少需要的糖果数。

样例输入:

3

1 10 1

3

6 2 3

2

1 1

样例输出:

4

5

2

看完题目,第一反应是要用动态规划解决。其最优子结构为:假如我们已经解决了(s,mid)以及(mid+1,e)这两个子问题,那么我们现在要按如下方法解决子问题(s,e)。首先分三种情况:1)score[mid]=score[mid+1];2)score[mid]

> score[mid+1];3)score[mid] < score[mid+1]。

1)由于分数相等的话对糖果的分配不做要求,所以最小的糖果数是两个子问题的和。

2)左边的分数大。此时若左边的糖果多的话,则最小糖果数也是两个子问题的和;否则调整左边的糖果分配,先将[mid]位置的糖果数分配为比[mid+1]位置多一个,然后从mid到s进行调整。

3)右边的分数大。此时若右边的糖果多的话,则最小糖果数也是两个子问题的和;否则调整右边的糖果分配,先将[mid+1]位置的糖果数分配为比[mid]位置多一个,然后从mid+1到e进行调整。

代码

69c5a8ac3fa60e0848d784a6dd461da6.png1 #include

2

3 int candyNum[100000];4 int score[100000];5

6 int distributeCandy(int,int);7 intmain()8 {9 intn,i;10 while(scanf("%d",&n)!=EOF){11 for(i=0;i

19 int distributeCandy(int s,inte)20 {21 if(s ==e){22 candyNum[s] = 1;23 return 1;24 }else if(s+1 ==e){25 if(score[s] ==score[e]){26 candyNum[s] = candyNum[e] = 1;27 return 2;28 }else if(score[s] >score[e]){29 candyNum[s] = 2;30 candyNum[e] = 1;31 return 3;32 }else{33 candyNum[s] = 1;34 candyNum[e] = 2;35 return 3;36 }37 }else{38 int total = 0;39 int mid = (s+e)/2;40 int left =distributeCandy(s,mid);41 int right = distributeCandy(mid+1,e);42 if(score[mid] == score[mid+1]){43 return left +right;44 }else if(score[mid] > score[mid+1]){45 if(candyNum[mid] > candyNum[mid+1])46 return left+right;47 else{48 total += (candyNum[mid+1]+1-candyNum[mid]);49 candyNum[mid] = candyNum[mid+1] + 1;50 int i = mid - 1;51 int totalAdd = 0;52 for(;i>=s;--i){53 if(score[i] <= score[i+1] || (score[i] > score[i+1] && candyNum[i] > candyNum[i+1]))54 break;55 else{56 total += (candyNum[i+1]+1-candyNum[i]);57 candyNum[i] = candyNum[i+1] +1;58 }59 }60 return left+right+total;61 }62 }else{63 if(candyNum[mid] < candyNum[mid+1])64 return left+right;65 else{66 total += (candyNum[mid]+1-candyNum[mid+1]);67 candyNum[mid+1] = candyNum[mid]+1;68 int i = mid+2;69 for(;i<=e;++i){70 if(score[i] <= score[i-1] || (score[i] > score[i-1] && candyNum[i] > candyNum[i-1]))71 break;72 else{73 total += (candyNum[i-1]+1-candyNum[i]);74 candyNum[i] = candyNum[i-1]+1;75 }76 }77 return left+right+total;78 }79 }80 }81 }

69c5a8ac3fa60e0848d784a6dd461da6.png

PS:此次第一名竟然在十四分钟内四道题全部AC,真是不可思议,估计有些题之前做过,直接拷贝过去或者稍微改一下。

原文:http://www.cnblogs.com/boostable/p/online_judge_1470_1549_1493_1550.html

这篇关于Java代码题m个小朋友分糖果,王道论坛研究生机试练习赛(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217932

相关文章

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python