文章目录

  • 4.1 A.分数求和(最小公倍数、最大公因数)
  • 4.2 B.更换电池(贪心算法、保留一位小数)
  • 4.3 C.苹果掉落
  • 4.4 D.计算23点(递归)
  • 4.5 E.翻译单词(最长公共子序列、动态规划)

4.1 A.分数求和(最小公倍数、最大公因数)

Problem
A,B,C三个有理数写成分子分母为整数的分数的形式,请你计算A+B+C.

Input
输入共T+1行,第一行有一个整数T代表共有T组数据。接下来有T行,每行有3个分数由空格隔开,每个分数的形式都是n/d,n与d均为正整数。
1 ≤ T ≤ 103
1 ≤ n,d ≤ 106
Output
输出T行,每行输出一个分数,等于对应行的三个分数之和,分数应是最简分数形式。若所求结果是整数,仍要写成分母为1的分数形式。

Example
input
2
1/2 1/3 1/4
3/2 1/2 2/2

output
13/12
3/1

Answer
计算最大公因数和最小公倍数。
法一:三个分数之和为

num = a1b2b3 + b1a2b3 + b1b2a3
dcn = b1b2b3
注意分子和分母最大可能达106,所以它们相乘肯定会超过int类型的范围,将num与den设为long long类型。计算num与den的最大公因数g,按照num/g输出分子,den/g输出分母即可

#include <iostream>
using namespace std;//最大公因数
int gcd(long long a,long long b){if (a%b==0)return b;elsereturn gcd(b,a%b);
}int main(void){int T,a1,a2,a3,b1,b2,b3,g;char c;long long num,den;cin>>T;while(T--){num=0;den=0;cin>>a1>>c>>b1;cin>>a2>>c>>b2;cin>>a3>>c>>b3;num =(long long)a1*b2*b3;num+=(long long)b1*a2*b3;num+=(long long)b1*b2*a3;den=(long long)b1*b2*b3;g=gcd(num,den);cout<<num/g<<"/"<<den/g<<endl;}return 0;
}法二:先求分母最小公倍数
#include <iostream>
using namespace std;//最小公倍数
long long minCommonMultiple(long long x, long long y){long long tx = x;long long ty = y;while(tx != ty){if(tx > ty)tx = tx-ty;elsety = ty-tx;}return x/tx*y;
}//最小公因数
long long minimumCommonDenominator(long long x, long long y){long long t;if(x < y){t=x;x=y;y=t;}while(t = x%y){x=y;y=t;}return y;
}//分数相加
void add(long long a[][3], long long b[][3], long long i, long long j){long long ta,tb,t;tb = minCommonMultiple(b[i][j],b[i][j+1]);ta = tb/b[i][j]*a[i][j] + tb/b[i][j+1]*a[i][j+1];t = minimumCommonDenominator(ta,tb);a[i][j+1] = ta/t;b[i][j+1] = tb/t;
}int main(){long long T;cin>>T;long long a[T][3],b[T][3];char c;long long i,j;for(i=0;i<T;i++){cin>>a[i][0]>>c>>b[i][0];cin>>a[i][1]>>c>>b[i][1];cin>>a[i][2]>>c>>b[i][2];}for(i=0;i<T;i++){for(j=0;j<2;j++){add(a,b,i,j);}}for(i=0;i<T;i++){cout<<a[i][2]<<"/"<<b[i][2]<<endl;}
}

4.2 B.更换电池(贪心算法、保留一位小数)

Problem
Bob有一部旧式的收音机,收音机要放两节电池才能工作。为了尽可能长时间的听广播,Bob买了很多电池给收音机供电,这些电池质量不同,因而使用时长也不同,有的能使用7个小时,有的可能就只能使用4个小时。显然如果他只有两节电池一个能用7小时一个能用4小时,那么他只能听4个小时的相声,那7小时的电池剩下的3小时的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三节电池分别能用4、4、7小时,他可以先使用两节能用4个小时的电池,使用半个小时后再把其中一个换成能使用7个小时的电池,3.5小时后其中一节的电量耗尽,再把剩下的一节电池换成刚才换下的电池(那个电池还能用3.5个小时),这样收音机总共就可以使用0.5+3.5+3.5=7.5个小时,就没有造成浪费。
现在已知电池的数量和各电池能够使用的时间,请你帮助Bob计算一下最多能听几个小时的广播。

Input
输入多组数据,每组数据有两行,第1行有一个整数N,代表Bob的电池的个数,第二行有N个正整数,表示各颗电池能使用的时间
1 ≤ N ≤1000
电池的使用时间是[1,230]范围内的正整数
Output
对每组数据输出一行,分别表示Bob能听广播的时长,保留到小数点后1位。

Example
input
2
7 4
3
4 4 7

output
4.0
7.5

key:要使用EOF判断输入数据的结束

Answer
如果有一根超级电池,除它之外的所有电池的总和都不如这个超级电池的电量多,那么就把超级电池一直放在收音机里,让其余的电池陪跑,这种情况下Bob收听广播的时长就是除了最长电池之外的其它所有电池的时长之和。而这个“超级电池”的资格是,它的可用电量不小于其余所有电池电量之和。如果只有两节电池,时间长的那个必然是“超级电池”
而如果没有这种超级电池,所有电池的可用时长都相差没有那么悬殊,总是选当前剩余时间最长的两节电池来用。可以归纳地得出,最终电池的情况总可以变为(2,1,1),或(1,1,0)或(1,1,1)。而这三种情况都可以不浪费,也就是说最长电池的时长不超过其余电池时长之和的时候,全部电池都可以完全利用,此时听广播的时间则是所有电池时长之和除以2(因为同时要用2节电池)。

#include <iostream>>
using namespace std;
#include <iomanip>#include <numeric>
using std::accumulate;#include <algorithm>
using std::sort;int main(){int *a,N,i,res;while(cin>>N){int *a = new int [N];for(i=0;i<N;i++)cin>>a[i];sort(a,a+N);res=accumulate(a,a+N-1,0);if(res<a[N-1])cout<<fixed<<setprecision(1)<<(float)res<<endl;elsecout<<fixed<<setprecision(1)<<(float)(res+a[N-1])/2<<endl;delete [] a;}return 0;
}

4.3 C.苹果掉落

Problem
Bob在郊外摄影,看到山坡上有一棵苹果树,有些苹果成熟了就会从枝头掉落,Bob就把这个影像拍摄下来。在苹果树上挂着一些网袋,是果农用来收苹果用的,如果苹果位于网袋上方,就会落入网袋中而不落到地面。现在给你Bob拍摄的照片,请你帮助Bob把照片处理成苹果最终落到地面或网袋的情况。假设拍照时没有风,所有苹果都是完全垂直下落的,并且多个苹果不重叠在同一个位置,网袋的位置固定不动。
Bob拍摄的照片用仅包含".a#"这三个字符的矩阵来代表,其中‘a’表示苹果,’#‘表示网袋底部位置,’.'表示照片中的背景空白处。拍摄照片时苹果有的是在空中的,但苹果最终会落入网袋,或直接落到地面,或者堆到之前已落下苹果的上方。请你把照片转换成所有苹果都落下的情形。

Input
输入第1行有两个整数R和C,表示照片的尺寸。接下来有R行,每行有C个字符,这R*C个字符中仅出现".a#“这三种。
1≤R≤50000 and 1≤C≤10
Output
输出R行,每行C个字符的矩阵。输出仅包含”.a#"这三个字符,用以表示苹果下落到地面或网袋中的照片

Example
input
3 3
aaa
#.a
…#

output
a.a
#.a
.a#

Answer

#include <iostream>
using namespace std;int main(){int R,C;cin>>R>>C;char apple[R][C];int i,j;for(i=0;i<R;i++){for(j=0;j<C;j++){cin>>apple[i][j];}}int num,top,bottom;for(j=0;j<C;j++){i=0;top=0;bottom=0;while(bottom<R && top<R){i = top;while(apple[i][j] != '#' && i<R){i++;}bottom = i-1;i = top;num = 0;while(i <= bottom){if(apple[i][j] == 'a'){num++;apple[i][j] = '.';}i++;}i = bottom;while(num > 0){apple[i][j] = 'a';num--;i--;}top = bottom+2;}}for(i=0;i<R;i++){for(j=0;j<C;j++){cout<<apple[i][j];}cout<<endl;}return 0;
}

4.4 D.计算23点(递归)

Problem
24点游戏是非常经典而简单的小游戏,从一堆扑克牌中抽取4张,向其中添加运算符号并使其运行结果恰等于24,这叫作24点游戏。
现在我们不再是组合24,而是组合23。然而23是个质数,不像24那样非常容易组合,所以就希望你写程序帮助判断一下,给出5个数字,并且仅使用+,-,×这三种运算,有没有可能组成一个表达式的结果是23
key:假设运算+,-,×的优先级相同,且运算顺序是从左向右。

Input
多行数据,每行有5个数字,你需要使用这5个数字按题目描述组合出23,输入的最后一行是5个0代表数据结束,这一行不需要有输出。
Output
除最后一行外,若对应的数据可以组合出表达式的结果是23,则输出Possible,否则输出Impossible.

Example
input
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0

output
Impossible
Possible
Possible

key:第2组数据3+4+5×2-1=23,第3组数据2×11+5+3-7=23

Answer
解法很多,数据量不是特别大,所以直接搜索解空间(生成数组的全排列,然后遍历所有的运算)也能正确解答。
使用递归解决:给出了5个数,假设它的某个排列是[x1,x2,x3,x4,x5],要判断用这5个数计算23,只需要判断用[x1,x2,x3,x4]能否计算出23-x5,或能否算出23+x5,或者在23被x5整除的情况下能否算出23/x5(这分别代表[…]+5=23,[…]-5=23与[…]×5=23),这样问题的规模就减小到4个数。
再递归的做下去:用[x1,x2,x3]能否算出(23-x5)-x1,或者能否算出(23-x5)+x1,或是(23-x5)被x1整除的情况下能否算出(23-x5)/x1…最后当数组规模只剩1的时候,直接判断要计算的目标是不是数组里的这个数字即可,并且对初始的5个数的所有排列形式都分别递归。只要有任何一个递归函数最终达到了[x1]==计算目标,就返回true,将所有递归结果用“逻辑或”相连接。

#include <cstdio>int f(int target,int *a,int N){int i,j;if(N==1)return a[0]==target;int *b;bool pr,mr,tr=false;b=new int [N];for(i=0;i<N;i++){for(j=0;j<i;j++)b[j]=a[j];for(j=i+1;j<N;j++)b[j-1]=a[j];pr=f(target-a[i],b,N-1);mr=f(target+a[i],b,N-1);if(target%a[i]==0)tr=f(target/a[i],b,N-1);if(pr||mr||tr)break;}delete [] b;return pr||mr||tr;
}int main(void){int i,a[5];bool bf;while(1){bf=true;for(i=0;i<5;i++){scanf("%d",a+i);if(a[i]>0)bf=false;}if(bf)break;if(f(23,a,5)==true)printf("Possible\n");elseprintf("Impossible\n");}return 0;
}

4.5 E.翻译单词(最长公共子序列、动态规划)

Problem
·翻译的一个单词,可以分如下两步翻译:将一个原始单词S分成两段L和R,然后求两个字符串L与R的最长公共子序列M。对于原始单词S的所有切分方法,当最长公共子列M的长度最长时,这个公共子列M就是原始单词对应的Bob可以看懂的单词。
例如对于"ABCABCABAB",可以打断成"ABCABC"与"ABAB",或打断成"ABCAB"与"CABAB",可以组成长度最长的最长公共子序列,均是ABAB。
输入文件最后有"#END"表示输入数据结束,这一行不需要处理。
每行数据保证至少有一个字母重复出现。

Input
输入多行,每行有一个单词,单词仅含大写字母且长度不超过300,并且每个单词至少有一个字母重复出现。

Output
除最后一行"#END"之外,每行输出一个字符串,表示对应翻译后的单词。如果长度最大的最长公共子序列有多个,输出任意一个都是正确的。

Example
input
ABCABCABAB
ZZZZZZZZZZZZ
#END

output
ABAB
ZZZZZZ

Answer
先写能够计算最长公共子序列的函数,然后对每种切分方式(遍历所有可切分的点),分别计算两串的最长公共子序列,记下最长的长度和序列,然后输出最长的那个序列即可。此题思路不难,关键在于如何输出最长公共子序列以及如何适当的存储中间数据。
最长公共子序列是动态规划的经典问题。

#include <cstdio>
#include <cstring>
#include <algorithm>
using std::max;int LCS(char* s1, char* s2,char *res){int i,j,M,N,k=0,upbd;M=strlen(s1);N=strlen(s2);int **dp;dp=new int* [M+2];for(i=0;i<M+2;i++)dp[i]=new int [N+2];for(i=0;i<N+2;i++)dp[0][i]=0;for(i=1;i<M+1;i++){dp[i][0]=0;for(j=1;j<N+1;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}k=dp[M][N];i=M;j=N;upbd=k;res[k]='\0';while(i>0 && j>0){if(dp[i-1][j]==dp[i-1][j-1] && dp[i-1][j-1]==dp[i][j-1] ){if (dp[i][j]==dp[i-1][j-1]+1)res[--upbd]=s1[i-1];i--;j--;}else{if(dp[i-1][j]==dp[i][j])i--;elsej--;}}for(i=0;i<M+2;i++)delete [] dp[i];delete [] dp;return k;
}void solve(char *s){char *s1,*s2,*res,*target;int N=strlen(s),i,d,maxVal=-1;s1=new char [N+1];s2=new char [N+1];res=new char [N+1];target=new char [N+1];for(i=1;i<N;i++){strcpy(s1,s);s1[i]=0;strcpy(s2,s+i);d=LCS(s1,s2,res);if(d>maxVal){maxVal=d;strcpy(target,res);}}printf("%s\n",target);delete [] s1;delete [] s2;delete [] res;delete [] target;
}#define MAXLENGTH 303
int main(void){char s[MAXLENGTH];while(scanf("%s",s)!=EOF){if(strcmp("#END",s)==0)break;solve(s);}return 0;
}

OJ-malic竞赛04相关推荐

  1. 河南工业大学2017“玲珑杯”程序设计竞赛 04

    1263: rqy的键盘 时间限制: 1 秒  内存限制: 128 MB 提交: 186  解决: 101 提交 状态 题目描述 rqy在和妹子约会,突然女票打来电话.rqy骗女票他在写代码.女票为了 ...

  2. 算法竞赛:Online Judge介绍

    专栏:算法竞赛 上一篇: 下一篇: 文章目录 一.什么是Online Judge 二.Online Judge 网站 1. 洛谷 2. LeetCode 力扣 3. 牛客 4. PTA 拼题A 三.算 ...

  3. 算法与面试之-如何准备算法面试

    主要介绍算法面试的一些问题.以及如何准备算法面试 算法面试不仅仅是正确的回答问题 对于面试中遇到的大多数问题,都能有一个合理的思考路径 什么是算法面试? 让大家在面对面试中的算法问题时,有一个合理的思 ...

  4. 玩转算法面试:(一)什么是算法面试?

    前言 对于面试中遇到的大多数问题 都能有一个合理的思考路径 沟通: 边界条件是怎样的? 数据范围如何? 某些术语是具体如何定义的? 基础数据结构 算法设计思想: 递归分治 贪心 动态规划 回溯搜索 L ...

  5. 转载-工业界视频理解解决方案大汇总(人工智能前沿讲习)

    工业界视频理解解决方案大汇总 01 阿里巴巴 视频理解平台 视频理解能力 02 爱奇艺 多模态人物识别 爱奇艺 PRCV 2018 多模态视频人物识别挑战赛 爱奇艺 ACM MM 2019 多模态视频 ...

  6. 从0基础到蓝桥杯C/C++B组国奖

    今天主要是想给大家分享一下我是如何从大一0基础再到拿到蓝桥杯国奖的,也希望为0基础的小白想要入坑算法竞赛提供一些宝贵的经验. 入集训队 我本身是软件工程专业的学生,在入学的时候毫无基础,在学长学姐(好 ...

  7. 下半年重要的10大美国写作比赛不要错过

    写作是英美顶尖高校十分重视的一项基础技能.无论你要学什么专业,拥有好文笔,无疑能吸引招生官眼球,还能助你斩获梦校offer.下半年重要的10大美国写作比赛不要错过! 对于想展示英语写作能力的同学来说, ...

  8. caioj1212:【计算几何】判断线段相交(快速排斥判断与跨立实验)

    首先,欢迎大家来访问我老师的OJ:小白菜OJ 你是新入门OI的小白吗? 你正在苦于网上的资料不足吗? 你正在因各种blog写得不清不楚.艰涩难懂.千篇一律.满篇术语像LB一样而烦恼吗? 欢迎来到小白菜 ...

  9. 时间复杂度计算及空间复杂度计算

    目录 1.算法效率 2.时间复杂度 3.空间复杂度 4.大O渐进表示法 5.常见时间复杂度 常见复杂度对比 oj练习 1.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率.时间效率被 ...

最新文章

  1. python使用列表推导式(list comprehension)和itertools生成浮点数列表
  2. jquery-1 jquery几个小实例
  3. 白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
  4. Java课程作业02
  5. opensips和pbx之间的连接
  6. 又一编辑神器-百度编辑器-Ueditor
  7. SAP Cloud for Customer的Data Source测试
  8. 王小云计算机,王小云学者主页-科技工作者之家
  9. execl中设置的格式无法实现
  10. 推荐一个神器 - 把你的照片随心所欲的摆成各种形状
  11. OpenShift 4 - 用Buildah定制UBI容器镜像
  12. Sql Server 事务日志(二)
  13. 正则表达式及常用大全
  14. char *转为pansichar
  15. Java8 实战系列-05-lambda 类型推断
  16. fluent前处理——gambit边界设置
  17. 【转】D365 FO第三方集成(四)---客户端调用
  18. 趣店罗敏:从寒门贵子到面临退市 再到抢占预制菜新风口
  19. javase printwriter 打印流
  20. 在线思维导图Processon部分截图

热门文章

  1. OUC2021软件工程OUC拼车程序小组Gamma阶段博客目录
  2. win7安装SQL2005
  3. 矮人DOS工具箱 4.2:把DOS/Ghost/分区专家集成至启动菜单
  4. pycharm调试模式
  5. 计算机毕业设计django基于python学校在线打印系统
  6. windows系统安装live-server
  7. Centos7创建DNS服务器(超级简单,一看就会)
  8. css 优惠券样式大全
  9. 如何更简单的使用Polly
  10. 干货 | 手把手教你搭建一套OpenStack云平台