洛谷平台题单100链接:https://www.luogu.com.cn/training/100#problems
目录
学习笔记:
P1001 A+B Problem
P1000 超级玛丽游戏
P5703 【深基2.例5】苹果采购
P5704 【深基2.例6】字母转换
P5705 【深基2.例7】数字反转
P5706 【深基2.例8】再分肥宅水
P1425 小鱼的游泳时间
P2433 【深基1-2】小学数学 N 合一
P5708 【深基2.习2】三角形面积
P1421 小玉买文具
P5709 【深基2.习6】Apples Prologue
P2181 对角线
P5707 【深基2.例12】上学迟到
P3954 [NOIP 2017 普及组] 成绩
p1000 超级玛丽
Question1:直接粘贴超级玛丽图案会报错,为什么?
Answer:猜想:cout 不支持字符串的换行行为,经hello world测试已证实。
P5704 【深基2.例6】字母转换
Question2:ASCII码的作用?char字符型变量的存储方式?
Answer:
ASCII,英文全称是American Standard Code for Information Interchange,中文名称就是美国信息互换标准代码,他是基于拉丁字母的一套电脑编码系统。ASCII码表主要用于显示现代英语和其他西欧语言。
ASCII码大致可以分作三部分组成,第一部分是ASCII非打印控制字符,第二部分是ASCII打印字符,第三部分是扩展ASCII打印字符。
( https://blog.csdn.net/bisal/article/details/106088569)
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)。
例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示。
而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码)。
而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
美国信息交换标准代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,是一种标准的单字节字符编码方案,用于基于文本的数据。
(原文链接:https://blog.csdn.net/zhangnipa/article/details/108764205)
在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。
字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如'5'和5 是不同的。'5'是字符型数据,不能参与运算。
(原文链接:https://blog.csdn.net/weixin_34043312/article/details/117014304)
P5705 【深基2.例7】数字反转
这道题用了算术运算符取余的方法,做完了以后看了一下题解,还有更巧妙的char+scanf输入方法
Question3:%两边的数据类型必须是整型int吗?
Answer:是的,否则会报错 invalid operands of types 'float' and 'int' to binary 'operator%'
P5706 【深基2.例8】再分肥宅水
输出数据应该完全按照样例,该换行时就要用换行符。
P2433 【深基1-2】小学数学 N 合一
(1)注意对小学奥数题也不要掉以轻心,有些题目需要仔细的计算,有些题目需要仔细看题。
(2)保留 6 位有效数字并不是小数点后六位
(3)用到开根号函数 pow(117,0.5) 时,记得加头文件#include
(4)用到printf函数时记得加头文件#include
(5)熟悉char字符型的字符、数字之间的转换,如A为第1个字母,那么M的编号为几,编号为18的字母是哪个: cout << (int)('M'-'A')+1<<"\n"<< (char)('A'+18-1);
P5708 【深基2.习2】三角形面积
变量使用double来定义
四舍五入精确到一位小数时,可以 printf("%.1f",round(s*10)/10.0); 先乘10再四舍五入再除以10.0
P5709 【深基2.习6】Apples Prologue
做这道题时一定要注意题中的陷阱,想问题想全面:
(1)一定一定要注意表达式中的除数不能为零
(2)条件的判断,规定时间内吃完整数个苹果的情况、规定时间内有吃了整数多半个苹果的情况
(3)还有一种情况也要考虑到,那就是规定时间内早已经把苹果吃完啦!
P2181 对角线
这道题我并不会写!看了题解,终于找到了一种通俗易懂的题解:
首先要熟悉一下排列组合公式:
(原文链接:https://www.zhihu.com/question/26094736)
已知:边长、顶点个数为n,本题中任何三条对角线都不会交于一点
推导:(1)每两个顶点连成一条对角线
(2)每两条对角线有一个顶点
(3)每一个交点是有两条对角线相交得到的,两条对角线对应着四个顶点
总结:此题转化为:从n个顶点中选出4个顶点,有多少种选法?
但是 obviously 这显然不是小学生数学知识能做出来的!!!_(:з」∠)_需要再学习写一篇排列组合说明文档
但是还有一点需要补充就是题中给的输入数值很大所以定义变量和存储变量时可以使用 unsigned long long 来解决
还有一种方法是通过高精算法来解决,但是这个!!!显然不是此阶段知识所涉及到的内容,需要再学习写一篇高精算法说明文档
这道题一开始做了只有82分,两个测试点没有通过,第四个测试点数据:输入数据:9765,输出数据:3964374251598225115
解决方案:测试unsigned long long的存储范围:
#include
#include
using namespace std;
int main(){
long long ll_min = LLONG_MIN;
long long ll_max = LLONG_MAX;
unsigned long long ull_max = ULLONG_MAX;
printf("min of long long: %lld\n", ll_min); // min of long long: -9223372036854775808
printf("max of long long: %lld\n", ll_max); // max of long long: 9223372036854775807
printf("max of unsigned long long: %llu\n", ull_max); // max of unsigned long long: 18446744073709551615
}
测试结果为可以存储20位,运算过程中数值可达到10的20次方,所以提前做除法降值,
n和n-1一定有一个是2的倍数,因此2可以除尽,
同理n,n-1,n-2中一定有一个是3的倍数,因此3可以除尽(除掉2只会消除因数2而对3没有影响)
同理4也可以除尽,
可将结果转化为 n (n-1) (n-2) (n-3) / 24 转化为 n (n-1) / 2 (n-2) / 3 (n-3) / 4
#include
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b;
return 0;
}
#include
using namespace std;
int main()
{
cout << " ********" << endl
<< " ************" << endl
<< " ####....#." << endl
<< " #..###.....##...." << endl
<< " ###.......###### ### ###" << endl
<< " ........... #...# #...#" << endl
<< " ##*####### #.#.# #.#.#" << endl
<< " ####*******###### #.#.# #.#.#" << endl
<< " ...#***.****.*###.... #...# #...#" << endl
<< " ....**********##..... ### ###" << endl
<< " ....**** *****...." << endl
<< " #### ####" << endl
<< " ###### ######" << endl
<< "##############################################################" << endl
<< "#...#......#.##...#......#.##...#......#.##------------------#" << endl
<< "###########################################------------------#" << endl
<< "#..#....#....##..#....#....##..#....#....#####################" << endl
<< "########################################## #----------#" << endl
<< "#.....#......##.....#......##.....#......# #----------#" << endl
<< "########################################## #----------#" << endl
<< "#.#..#....#..##.#..#....#..##.#..#....#..# #----------#" << endl
<< "########################################## ############" << endl;
return 0;
}
#include
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a*b;
return 0;
}
#include
using namespace std;
int main()
{
char a;
cin >> a;
cout << char(a-('a'-'A'));
return 0;
}
#include
using namespace std;
int main(){
float m,n;
int num;
int a,b,c,d;
cin >> m;
num = m*10;
a = num/1000;
b = num/100%10;
c = num/10%10;
d = num%10;
n = d + c*0.1 + b*0.01 + a*0.001;
cout << n;
return 0;
}
#include
#include
using namespace std;
int main(){
float t;
int n;
cin >> t >> n;
printf("%.3f\n%d",t/n,2*n);
return 0;
}
#include
using namespace std;
int main(){
int a, b, c, d, e, f;
cin >> a >> b >> c >> d;
e = c - a;
f = d - b;
if(f < 0){
e = e - 1;
f = 60 + d - b;
}
cout << e << " " << f;
return 0;
}
#include
#include
#include
#include
using namespace std;
const double pai = 3.141593; //定义全局变量,浮点型、不可被修改
int main() {
int T;
cin >> T;
if (T == 1) {
cout << "I love Luogu!";
} else if (T == 2) {
cout << 2 + 4 << " " << 10 - 2 - 4;
} else if (T == 3) {
cout << 14 / 4 << endl << 14 / 4 * 4 << endl << 14 % 4;
} else if (T == 4) {
printf("%3.3f",500.0/3); // 保留六位有效数字
} else if (T == 5) {
cout << 15;
} else if (T == 6) {
cout << pow(117,0.5);
} else if (T == 7) {
cout << 100 + 10 << "\n"
<< 100 + 10 - 20 << "\n"
<< 0 ;
} else if (T == 8) {
int r = 5;
cout << 2*r*pai << endl
<< pai*r*r << endl
<< pai*r*r*r*4/3;
} else if (T == 9) {
int taozi = 1;
for(int day = 1;day<=3;day++){
taozi = (taozi+1)*2;
}
cout << taozi;
} else if (T == 10) {
cout << 9;
} else if (T == 11) {
cout << 100.0/(8-5);
} else if (T == 12) {
cout << (int)('M'-'A')+1<<"\n"
<< (char)('A'+18-1);
} else if (T == 13) {
float ra,rb;
int rc;
ra = pai*4*4*4*4/3 ;
rb = pai*10*10*10*4/3 ;
rc = pow(ra+rb,1.0/3);
cout << rc;
} else if (T == 14) {
cout << 50;
}
return 0;
}
#include
#include
#include
using namespace std;
int main(){
double a, b, c;
double p, s;
cin >> a >> b >> c;
p = 1.0*(a+b+c)/2;
s = pow(p*(p-a)*(p-b)*(p-c),0.5);
printf("%.1f",round(s*10)/10.0);
return 0;
}
#include
using namespace std;
int main(){
int a, b, c;
cin >> a >> b;
c = (b+a*10)/19;
cout << c;
return 0;
}
#include
using namespace std;
int main(){
unsigned int m, t, s;
cin >> m >> t >> s;
if(t == 0){ // 0不能做除数
cout << 0;
return 0;
}else if((s/t)>=m){ // s时间段内可以把苹果吃完
cout << 0;
}
else if(s%t == 0){ // s时间段内吃了整数个苹果
cout << m-s/t;
}else{ // s时间段内吃了整数+不到一个苹果
cout << m-(s/t+1);
}
return 0;
}
#include
using namespace std;
int main(){
unsigned long long n,m;
cin >> n;
m = n *(n-1) / 2 *(n-2) / 3 * (n-3) / 4;
cout <
#include
#include
using namespace std;
int main(){
int s, v, t, hour, min;
cin >> s >> v;
if(v <= 0){ // 速度既不可以是0,也不可以是负数
return 0;
}
if(s%v == 0){ // 计算用时t,除得尽时直接用,除不尽时取整加一
t = 10 + s/v;
}else{
t = 10 + s/v + 1;
}
if(t > 8*60+24*60){ // 第一种情况,不能在规定时间内走完
return 0;
}else if(t > 8*60){ // 第二种情况,不能在当天走完
t = 24*60 - (t - 8*60); // 为时间转化做准备
}else{ // 最后一种情况,能在当天走完
t = 8*60-t; // 为时间转化做准备
}
hour = t / 60;
min = t % 60;
printf("%.2d:%.2d", hour, min);
return 0;
}
#include
using namespace std;
int main(){
int A, B, C;
cin >> A >> B >> C;
cout << A*0.2 + B*0.3 + C*0.5;
return 0;
}