此类题型根据题目描述进行代码的编写,考察代码能力,刷题记录如下:
一个数组_A_中存有_N_(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移_M_(≥0)个位置,即将_A_中的数据由(_A_0_A_1⋯_AN_−1)变换为(_AN_−_M_⋯_AN_−1_A_0_A_1⋯_AN_−_M_−1)(最后_M_个数循环移至最前面的_M_个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
每个输入包含一个测试用例,第1行输入_N_(1≤_N_≤100)和_M_(≥0);第2行输入_N_个整数,之间用空格分隔。
在一行中输出循环右移_M_位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
思路分析: 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。 输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。 思路分析: 前言:本题我虽然做出来了,但是在做的过程中我有参考答案,因此这道题的思路也记录一下。 思路分析: 前言:这题的解法我真是一点思路木有,属于是计组和数据结构的完美结合了,在下佩服;但如果要我硬写的话,我可能会用大数加减来解决这道题,但对这题来说有属于是稍微的杀鸡用牛刀了一些。 Given three integers A, B and C in (−263,263), you are supposed to tell whether A+B>C. The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces. For each test case, output in one line Case #X: true if A+B>C, or Case #X: false otherwise, where X is the case number (starting from 1). Each line should ends with ‘\n’. 思路分析: 前言:本题虽然不难,但是我卡了许久,或许是因为太久没有接触数学微分了,求导都没意识到常数求导结果是0,以及一些意想不到的bug,故此记录一下本题。 设计函数求一元多项式的导数。(注:xn(_n_为整数)的一阶导数为_nxn_−1。) 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。 思路分析: 前言:本题思路正确,然鹅,坑点竟然是我之前看过但又没有仔细考虑的浮点数加减问题,所以特此记录一下浮点数坑点的相关知识。 1.int long long类型变量的数据范围 输入样例 6.A1065题溢出情况
1.出错点:需要注意题目中未说明m#include
B1018 锤子剪刀布
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输出格式:
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
1.本题容易出错的关键在于使用scanf("%c")
的时候,%c
会读入空格和换行,需要使用getchar()
读入多余的换行符\n
,我是在打印读入的符号的时候发现的,当时想到这一方面的原因是因为我一开始使用了函数帮助我判断谁赢了,但是函数传回的参很奇怪,所以才往这一方向尝试,后来才想到这一点。
2.优化的点:
(k1+1)%3==k2
这一方式判断输赢#include
#include
A1042 Shuffling Machine
#include
1.这题与B1018 锤子剪刀布
有一些类似,它们都有以下特点:存在一定顺序(B1018是循环相克顺序,本题是字母与序号存在顺序关系)->可以将字母统一转换为数字,方便计算
A1065 A+B and C (64bit)
Input Specification:
Output Specification:
1.本题A B C的数据范围为[-2^63,2^63)
,需要用long long数据类型存储,但涉及到加法操作,一定会存在溢出的情况,即两个正数之和等于负数或两个负数之和等于正数。
2.溢出情况的分析,A+B的最大值是2^64-2
,对应在long long数据类型变量中存储的值是(2^64-2)%2^64=-2
,而A+B正溢出的取值范围易得[-2^63,-2]
,所以当A>0 B>0 A+B<0为正溢出,为true;反之,A+B的最小值是-2^64
,存储值是-2^64%2^64=0
,所以当A<0 B<0 C>=0为负溢出,为false。
3.值得注意的是,A+B溢出情况下,属于程序的未定义行为,此时的结果不一定是long long类型的,因此为了能够和C比较,我们需要把它存储在res中。#include
坑题记录
B1010 一元多项式求导
输入格式:
输出格式:
#include
1.常数的导数是0,故对应的系数项和指数项都是0
2.特殊情况当无非零多项式的时候,需要输出0 0
3.当有非零多项式和常数项同时存在的时候,常数项不需要输出
扩展:指数乘法需要考虑数组长度变化
A1002 A+B for Polynomials
浮点数加减:eps=1e-8
==
fabs(a-b)
>
(a-b)>eps
<
(a-b)<-(eps)
>=
(a-b)>-(eps)
<=
(a-b)<(eps)
3.1 简单模拟 刷题总结 易错点分析
int的数据范围是[-2^31,2^31-1]
,数量级范围为[-2*10^9,2*10^9]
long long的数据范围是[-2^63,2^63-1]
,数量级范围为[-9*10^18,9*10^18]
2.输出变量名错误,手误,复制粘贴的时候尤其容易犯这错误
3.边界情况的考虑B1008
4.字母与数字的转换,A1042
和B1018
的总结,如果涉及到字母和数字的结合处理,同时字母存在一定的规律,可以考虑把字母转换为数字,统一运算。
5.空格读入,在读入数字的时候其实不用考虑这一问题,但是当题目的输入有字符的时候,需要格外注意:
%c
可以读入空格和换行符getchar()
可以读入空格和换行符,常用于读取换行符,常见应用如下
2
A Bscanf("%d",&n);
getchar();
scanf("%c %c",&a,&b);
getchar();
溢出的判定:正数相加得到负数,发生正溢出;负数相加得到正数,发生负溢出
溢出范围的确定:2^64-2(最大值)%