
算法(旧)
以前的算法练习
花花叔叔
以后不更新了。
展开
-
杭电oj 猫和老鼠的交易 HDOJ 1009--FatMouse‘ Trade 法特穆斯贸易 贪心算法
问题描述FatMouse准备了M磅的猫粮,准备与守卫仓库的猫交易,里面装着他最喜欢的食物JavaBean。仓库有N个房间。i-th 房间包含 J [i] 磅爪哇豆, 需要一磅猫粮。FatMouse不必用房间里所有的爪哇豆来交换,相反,如果他付给F[i]1%磅的猫粮,他可能会得到J[i]1%磅的爪哇豆。这里有一个真实的数字。现在,他正在给你分配这个作业:告诉他能得到的最大数量的爪哇豆。输入输入由多个测试案例组成。每个测试案例以包含两个非阴性整数 M 和 N 的行开头。然后N行跟随,每个线分别包含两个非原创 2021-03-03 20:10:12 · 1991 阅读 · 1 评论 -
杭电OJ 2501 骨牌铺满方格 递推
问题描述有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。输入加分项列多(T<=20)、"行图"T T=20)、"已分列"项分项项、“项长”(N<=30)、“亮起”"文标"要求、“已表示"要求”“已表示"和"已表示”"已表示"要求、"已表示"已表示、“已表示"和"已表示"已调和、“已调和"和"已变为"已调和”“已调用"和"已变为"已调用"和"已变为"已调用"项分项为"已调用"和"已变”。”输出输出一原创 2021-03-14 19:46:04 · 619 阅读 · 0 评论 -
折线分割平面 杭电oj2050 代码可AC
代码(可AC):#include<stdio.h>int a(int n){ if(n==1) { return 2; }else { return a(n-1)+4*(n-1)+1; } }int main(){ int m,i; scanf("%d",&m); int n; for(i=0;i<m;i++) { scanf("%d",&n); printf("%d\n",a(n)); } return 0;}原创 2021-03-14 19:11:59 · 412 阅读 · 0 评论 -
畅通工程 杭电oj1863 并查集实现
题目描述:某省调查诚城镇交通情况,得到现有城镇道路统计表,表中列出了每条道路直接联通的城镇,省政府“畅通计划”的目标试试任意两个城镇之间都可以实现交通。(不一定市直达)问最少需要建设多少条路?代码:#include<stdio.h>int bin[10000];int findx(int x)//实现查找功能,找到某元素的老大{ int i; int r=x; while(bin[r]!=r) { r=bin[r]; return r; }}int merge(原创 2021-03-12 08:38:38 · 243 阅读 · 0 评论 -
杭电oj-1050 Moving Tables
题目:著名的ACM(高级计算机制造商)公司租用了一栋建筑的地板,其形状如下。楼北侧和走廊南侧各有200间客房。最近,公司制定了一项改革体制的计划。改革包括在房间之间移动许多桌子。因为走廊很窄,所有的桌子都很大,只有一张桌子能穿过走廊。需要一些计划来使移动高效。经理想出了以下计划:在 10 分钟内将桌子从房间移到另一个房间即可完成。当将一张桌子从 i 房间移到房间 j 时,使用 I 房间前面和房间 j 前面之间的走廊部分。因此,在每 10 分钟内,两个房间之间将同时进行几次移动,这些房间不共享走廊的同一部原创 2021-03-05 16:31:22 · 357 阅读 · 0 评论 -
杭电OJ变形 骨牌铺满方格 2501
问题描述有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 ,请计算一共有多少种铺设的方法。(类似于斐波那契数列)问题分析:(重要)先将n=1,n=2分析出来,(先将初始的几个值分析出来)之后从最后面分析递推公式。所有的骨牌只有两只形式放置(横或者竖),当骨牌竖着放置时,所有的方法有f(n-1)种,当骨牌横着放置时,所有的方法有f(n-2)种;所以递推公式为这两种方法的总合 f(n)=f(n-1)+f(n-2)。代码:#include<stdi原创 2021-03-14 19:54:22 · 561 阅读 · 0 评论 -
并查集
常见两种操作:第一种方法:合并两个集合(代码效率不高)merge1(a,b){ i=min(a,b); j=max(a,b); for(i=0;i<=N;i++) { if(set[k]==j) { set[k]=i; } } } 对数组的所有元素进行遍历一边,查找数组元素是否为6,若是6,则将数组元素改写为2查找某元素属于哪个集合findl(x){ return set[x];}第二种方法:(树)合并两个集合直接将领导a归附于领导b即可m原创 2021-03-12 08:42:25 · 146 阅读 · 0 评论 -
杭电oj HDOJ 2050 折线分割平面(递推)算法 数学逻辑(由分割平面转化而来)
题目:我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。Input输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。Output对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。Sample Input212Sample Output27分析:原创 2021-03-13 20:18:53 · 612 阅读 · 0 评论 -
LeetCode 283 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非 零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。解法一:使用i遍历数组,使用j标记数组下一个位置(存放在遍历后面的时候不等于0的数字值,并且将此位置赋值为0)class Solution { public void moveZeroes(int[] nums) { int j = 0; for(int i = 0 ; i < nums.length.原创 2022-01-28 19:15:45 · 817 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) 1036 跟奥巴马一起编程 (15 分) p89
题目描述美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。输出格式:输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。输入原创 2021-08-10 11:50:38 · 362 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) B1008 数组元素循环右移问题 (20 分)
题目描述一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。输出格式在一行中输出循.原创 2021-08-12 10:15:40 · 338 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1046 Shortest Distance (20 分)
超时代码#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(0); int a[100000]; int n,m,start,end; int sum=0,ans1=0,asn2=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=原创 2021-08-16 22:50:41 · 387 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) B1011 A+B 和 C (15 分)
给定区间 [−231 231] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。输入格式:输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。输出格式:对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。输入样例:41 2 32 3 42147483647 0 21474原创 2021-08-11 18:24:02 · 343 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) B1018. 锤子剪刀布
题目描述大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。输入格式输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。输出格式输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代原创 2021-08-13 22:01:37 · 581 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) B1026 程序运行时间 (15 分)
题目描述要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差原创 2021-08-11 22:35:45 · 390 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) 1016 部分A+B (15 分)
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA、B、DB,请编写程序计算PA + PB。输入格式输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 10^10。输出格式在一行中输出PA + PB的值。输入样例13862767 6 13530293 3输出样例1399输入样例23862767 1 13530293原创 2021-08-11 20:32:47 · 346 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分)
题目描述Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos e原创 2021-08-15 12:14:23 · 341 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) 1010 一元多项式求导 (25 分)
题目描述设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)输入格式以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。输入样例3 4 -5 2 6 1 -2 0输出样例12 3 -10 1 6 0分析将数组下标作为指数次幂,数组值作为项前的系数。输入是从前往后,原创 2021-08-17 09:43:55 · 333 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) B1046 划拳 (15 分)
题目描述:划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。输入格式:输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:甲喊 甲划 乙喊 乙划其中喊是喊出的数字,划是划出的数字,均为不超过 100 的正整数(两只原创 2021-08-12 09:32:14 · 388 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文)1012 数字分类 (20 分)+易错测试点
题目描述给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:A1 = 能被 5 整除的数字中所有偶数的和;A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;A3 = 被 5 除后余 2 的数字的个数;A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;A5 = 被 5 除后余 4 的数字中最大数字。输入格式:每个输入包含 1 个测试用例。每个测试用例先给出一个不原创 2021-08-13 12:49:02 · 450 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文)1028. 人口普查(20分)
题目描述某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。输入格式输入在第一行给出正整数N,取值在(0, 10^5];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。输原创 2021-08-20 15:29:46 · 350 阅读 · 0 评论 -
PAT (Advanced Level) Practice 1011 World Cup Betting (20 分)
题目描述With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battles for the World Cup trophy in South Africa. Similarly, football betting fans were putting their m原创 2021-08-20 16:40:00 · 394 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) 1041 考试座位号 (15 分)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。输入格式输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考原创 2021-08-18 15:23:54 · 694 阅读 · 0 评论 -
PAT (Basic Level) Practice (中文) 1004 成绩排名 (20 分)
题目描述读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含 1 个测试用例,格式为第 1 行:正整数 n第 2 行:第 1 个学生的姓名 学号 成绩第 3 行:第 2 个学生的姓名 学号 成绩 … … …第 n+1 行:第 n 个学生的姓名 学号 成绩其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。输出格式:对每个测试用例输出原创 2021-08-18 16:32:04 · 583 阅读 · 0 评论