1. 算法训练 P1103
时间限制:1.0s 内存限制:256.0MB
编程实现两个复数的运算。设有两个复数和,则他们的运算公式为:
要求:(1)定义一个结构体类型来描述复数。
(2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。 (3)必须使用结构体指针的方法把函数的计算结果返回。 说明:用户输入:运算符号(+,-,*,/) a b c d.
输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。 输入:
- 2.5 3.6 1.5 4.9 输出: 1.00+-1.30i
2. 算法训练 Lift and Throw
时间限制:3.0s 内存限制:256.0MB
问题描述
给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这条射线上不同的三个点, 他们希望其中某个人能够到达下标最大的点.
每个角色只能进行下面的3种操作, 且每种操作不能每人不能进行超过一次. 1.移动一定的距离 2.把另一个角色高举过头 3.将举在头上的角色扔出一段距离
每个角色有一个movement range参数, 他们只能移动到没有人的位置, 并且起点和终点的距离不超过movement range.
如果角色A和另一个角色B距离为1, 并且角色B没有被别的角色举起, 那么A就能举起B. 同时, B会移动到A的位置,B原来所占的位置变为没有人的位置. 被举起的角色不能进行任何操作, 举起别人的角色不能移动.同时, 每个角色还有一个throwing range参数, 即他能把举起的角色扔出的最远的距离. 注意, 一个角色只能被扔到没有别的角色占据的位置. 我们认为一个角色举起另一个同样举起一个角色的角色是允许的. 这种情况下会出现3个人在同一个位置的情况. 根据前面的描述, 这种情况下上面的两个角色不能进行任何操作, 而最下面的角色可以同时扔出上面的两个角色. 你的任务是计算这些角色能够到达的位置的最大下标, 即最大的数字x, 使得存在一个角色能够到达x. 输入格式
1
输入共三行, 分别为Laharl, Etna, Floone的信息.
每一行有且仅有3个整数, 描述对应角色的初始位置, movement range, throwing range.
数据保证3个角色的初始位置两两不相同且所有的数字都在1到10之间. 输出格式
仅有1个整数, 即Laharl, Etna, Flonne之一能到达的最大距离. 样例输入 9 3 3 4 3 1 2 3 3 样例输出 15 样例说明
一开始Laharl在位置9, Etna在位置4, Flonne在位置2. 首先, Laharl移动到6.
然后Flonne移动到位置5并且举起Etna. Laharl举起Flonne将其扔到位置9. Flonne把Etna扔到位置12. Etna移动到位置15.
3. 算法训练 Multithreading
时间限制:1.0s 内存限制:256.0MB
问题描述
现有如下一个算法: repeat ni times yi := y y := yi+1 end repeat
令n[1]为你需要算加法的第一个数字,n[2]为第二个,...n[N]为第N个数字(N为需要算加法的数字个数),
并令y初始值为0,先令i=1运行这个算法(如上所示,重复n[i]次),然后令i=2运行这个算法。。直到i=N。注意y值一直不要清零。最后y的值就是你需要的加法答案。 你想知道,有没有某种运算顺序能使答案等于W。
一个循环中的全部语句,是不能改变在总的语句排列中的相对顺序的。
(这里的第i个循环是指这n[i]*2条语句。就是你把属于第i个循环的语句抽出来看,它们需要按照原顺序排列。在你没有运行完这个循环的最靠前一条未完成的语句的时候,你是不能跳过它先去完成这个循环后面的语句的。你能做的仅是把若干个循环按照你所规定的
2
顺序―归并‖起来。)
举个例子,n[1]= 2 ,n[2]=1, W=1.一种可行的运算顺序是―2 1 1 1 1 2‖,数字为几表示运行第几个算法的下一条语句(你可以看到‖1‖出现了4次,是因为n[1]=2即循环两次,而每次循环里面有两条语句,所以2*2=4次)
执行0条语句过后 执行1条过后(y[2]=y) 执行2条过后(y[1]=y) 执行3条过后(y=y[1]+1) 执行4条过后(y[1]=y) 执行5条过后(y=y[1]+1) 执行6条过后(y=y[2]+1)
y值 0 0 0 1 1 2 1
y[1] 值 0 0 0 0 1 1 1
y[2] 值 0 0 0 0 0 0 0
可以看到,最后y值变成了1,也就完成了我们的任务。 输入格式
第一行你会得到用空格分开的两个整数N(1<=N<=100)和W(-10^9<=W<=10^9),(N为需要算加法的数字个数,W是你希望算出的数)。 第二行你会得到n个整数n[i] (1<=n[i]<=1000). 输出格式
第一行您应该输出Yes(若能以某种顺序使得这个算法得出W的值) 或No。 如果第一行是No,接下来就不用继续输出了。
如果是Yes, 请在第2行输出2*sigma(n[i])个用空格隔开的数,表示任意一种满足条件的运算顺序。 样例输入 1 10 11 样例输出 No 样例输入
3
2 3 4 4 样例输出
Yes
1 1 2 1 2 2 2 2 2 1 2 1 1 1 1 2 样例输入 3 6 1 2 3 样例输出
Yes
1 1 2 2 2 2 3 3 3 3 3 3 数据规模和约定
对于30%的数据,n<=4, n[i]的和小于10.
对于100%的数据,n<=100 , -10^9<=W<=10^9, 1<=n[i]<=1000
4. 算法训练 Tricky and Clever Password
时间限制:2.0s 内存限制:256.0MB
问题描述
在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。
Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且 2X 严格小于串长度。然后他把密码分成 3 段,最前面的 X 个字符为一段,最后面的 X 个字符为一段,剩余的字符为一段。不妨把这三段依次称之为 prefix, suffix, middle 。显然, middle 的长度为一个大于 0 的奇数,且 prefix 、 suffix 的长度相等。他加密后的密码即为 A + prefix + B + middle + C + suffix ,其中 A 、 B 、 C 是三个由 Copa 选定的字符串,且都有可能为空, + 表示字符串相连。
许多年过去了。Copa 昨天找到了当年写下加密后字符串的那张纸。但是,Copa 把原密码、A、B、C 都忘了。现在,他请你找一个尽量长的密码,使得这个密码有可能被当年的 Copa 发明、加密并写下。 输入格式
输入包含一个只含有小写拉丁字母的字符串,长度在 1 到 10^5 之内。 输出格式
4
第一行包含一个整数 k ,表示你找到的原密码分成的 3 个部分中有多少个非空字符串。显然 k in {1, 3} 。接下来 k 行,每行 2 个用空格分开的整数 x_i l_i ,表示这一部分的起始位置和长度。要求输出的 x_i 递增。
起始位置 x_i 应该在 1 到加密后的字符串长度之间。 l_i 必须是正整数,因为你只要输出非空部分的信息。 middle 的长度必须为奇数。
如果有多组答案,任意一组即可。提示:你要最大化的是输出的 l_i 的总和,而不是 k 。 样例输入 abacaba 样例输出 1 1 7 样例输入 axbya 样例输出 3 1 1 2 1 5 1 样例输入 xabyczba 样例输出 3 2 2 4 1 7 2
数据规模和约定
对于 10% 的数据: n <= 10
对于 30% 的数据: n <= 100
对于 100% 的数据: n <= 100000
存在 20% 的数据,输出文件第一行为 1 。
5. 算法训练 Beaver's Calculator
5