洛谷刷题第一讲

美赛暂且告一段落,算法已经一点不会了,在此会先对洛谷往期做题进行回归,并会在之后开启数据结构与算法章节。

-----引言

image-20240206143327984

Hello,World!

题目描述

编写一个能够输出 Hello,World! 的程序。

提示: - 使用英文标点符号; - Hello,World! 逗号后面没有空格。 - HW大写字母。

输入格式

输出格式

样例 #1

样例输入 #1

1

样例输出 #1

1
Hello,World!

梦的起点

1
2
3
4
5
6
#include<iostream>
using namespace std;
int main() {
cout<<"Hello,World!";
return 0;
}

输出字符菱形

题目描述

* 构造一个对角线长 \(5\) 个字符,倾斜放置的菱形。

输入格式

没有输入要求。

输出格式

如样例所示。用 * 构成的菱形。

样例 #1

样例输入 #1

1

样例输出 #1

1
2
3
4
5
*
***
*****
***
*
1
2
3
4
5
6
7
8
9
//....
#include<cstdio>
using namespace std;
int main()
{
printf(" *\n ***\n*****\n ***\n *");

}

超级玛丽游戏

题目背景

本题是洛谷的试机题目,可以帮助了解洛谷的使用。

建议完成本题目后继续尝试 P1001P1008

另外强烈推荐新用户必读贴

题目描述

超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                ********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
using namespace std;
int main() {
printf(
" ********\n"
" ************\n"
" ####....#.\n"
" #..###.....##....\n"
" ###.......###### ### ###\n"
" ........... #...# #...#\n"
" ##*####### #.#.# #.#.#\n"
" ####*******###### #.#.# #.#.#\n"
" ...#***.****.*###.... #...# #...#\n"
" ....**********##..... ### ###\n"
" ....**** *****....\n"
" #### ####\n"
" ###### ######\n"
"##############################################################\n"
"#...#......#.##...#......#.##...#......#.##------------------#\n"
"###########################################------------------#\n"
"#..#....#....##..#....#....##..#....#....#####################\n"
"########################################## #----------#\n"
"#.....#......##.....#......##.....#......# #----------#\n"
"########################################## #----------#\n"
"#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n"
"########################################## ############\n"
);
return 0;
}

A+B Problem

题目背景

强烈推荐新用户必读帖

不熟悉算法竞赛的选手请看这里:

算法竞赛中要求的输出格式中,不能有多余的内容这也包括了“请输入整数 \(\bm a\)\(\bm b\)” 这一类的提示用户输入信息的内容。若包含了这些内容,将会被认为是 Wrong Answer,即洛谷上的 WA。在对比代码输出和标准输出时,系统将忽略每一行结尾的空格,以及最后一行之后多余的换行符。

若因此类问题出现本机似乎输出了正确的结果,但是实际提交结果为错误的现象,请勿认为是洛谷评测机出了问题,而是你的代码中可能存在多余的输出信息。用户可以参考在题目末尾提供的代码。

此外,请善用应用中的在线 IDE 功能,以避免不同平台的评测产生差异。

最后,请不要在对应的题目讨论区中发布自己的题解,请发布到题解区域中,否则将处以删除或禁言的处罚。若发现无法提交题解则表明本题题解数量过多,仍不应发布讨论。若您的做法确实与其他所有题解均不一样,请联系管理员添加题解。

题目描述

输入两个整数 \(a, b\),输出它们的和(\(|a|,|b| \le {10}^9\))。

注意

  1. Pascal 使用 integer 会爆掉哦!
  2. 有负数哦!
  3. C/C++ 的 main 函数必须是 int 类型,而且 C 最后要 return 0。这不仅对洛谷其他题目有效,而且也是 NOIP/CSP/NOI 比赛的要求!

好吧,同志们,我们就从这一题开始,向着大牛的路进发。

任何一个伟大的思想,都有一个微不足道的开始。

输入格式

两个以空格分开的整数。

输出格式

一个整数。

样例 #1

样例输入 #1

1
20 30

样例输出 #1

1
50

提示

广告

洛谷出品的算法教材,帮助您更简单的学习基础算法。【官方网店绝赞热卖中!】>>>

本题各种语言的程序范例:

C

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n", a+b);
return 0;
}
----------------

C++

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}
----------------

Pascal

1
2
3
4
5
var a, b: longint;
begin
readln(a,b);
writeln(a+b);
end.
-----------------

Python2

1
2
s = raw_input().split()
print int(s[0]) + int(s[1])

Python3

1
2
s = input().split()
print(int(s[0]) + int(s[1]))

Java

1
2
3
4
5
6
7
8
9
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) throws Exception {
Scanner cin=new Scanner(System.in);
int a = cin.nextInt(), b = cin.nextInt();
System.out.println(a+b);
}
}
-----------------

JavaScript (Node.js)

1
2
3
4
5
const fs = require('fs')
const data = fs.readFileSync('/dev/stdin')
const result = data.toString('ascii').trim().split(' ').map(x => parseInt(x)).reduce((a, b) => a + b, 0)
console.log(result)
process.exit() // 请注意必须在出口点处加入此行

Ruby

1
2
a, b = gets.split.map(&:to_i)
print a+b

PHP

1
2
3
4
<?php
$input = trim(file_get_contents("php://stdin"));
list($a, $b) = explode(' ', $input);
echo $a + $b;

Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
use std::io;

fn main(){
let mut input=String::new();
io::stdin().read_line(&mut input).unwrap();
let mut s=input.trim().split(' ');

let a:i32=s.next().unwrap()
.parse().unwrap();
let b:i32=s.next().unwrap()
.parse().unwrap();
println!("{}",a+b);
}

Go

1
2
3
4
5
6
7
8
9
package main

import "fmt"

func main() {
var a, b int
fmt.Scanf("%d%d", &a, &b)
fmt.Println(a+b)
}

C# Mono

1
2
3
4
5
6
7
8
using System;

public class APlusB{
private static void Main(){
string[] input = Console.ReadLine().Split(' ');
Console.WriteLine(int.Parse(input[0]) + int.Parse(input[1]));
}
}

Visual Basic Mono

1
2
3
4
5
6
7
8
Imports System

Module APlusB
Sub Main()
Dim ins As String() = Console.ReadLine().Split(New Char(){" "c})
Console.WriteLine(Int(ins(0))+Int(ins(1)))
End Sub
End Module

Kotlin

1
2
3
4
fun main(args: Array<String>) {
val (a, b) = readLine()!!.split(' ').map(String::toInt)
println(a + b)
}

Haskell

1
2
3
main = do
[a, b] <- (map read . words) `fmap` getLine
print (a+b)

Lua

1
2
3
a = io.read('*n')
b = io.read('*n')
print(a + b)

OCaml

1
Scanf.scanf "%i %i\n" (fun a b -> print_int (a + b))

Julia

1
2
nums = map(x -> parse(Int, x), split(readline(), " "))
println(nums[1] + nums[2])

Scala

1
2
3
object Main extends App {
println(scala.io.StdIn.readLine().split(" ").map(_.toInt).sum)
}

Perl

1
2
3
4
5
my $in = <STDIN>;
chomp $in;
$in = [split /[\s,]+/, $in];
my $c = $in->[0] + $in->[1];
print "$c\n";
1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a + b;


}

字符三角形

题目描述

给定一个字符,用它构造一个底边长 \(5\) 个字符,高 \(3\) 个字符的等腰字符三角形。

输入格式

输入只有一行,包含一个字符。

输出格式

该字符构成的等腰三角形,底边长 \(5\) 个字符,高 \(3\) 个字符。

样例 #1

样例输入 #1

1
*

样例输出 #1

1
2
3
*
***
*****

提示

对于 \(100 \%\) 的数据,输入的字符是 ASCII 中的可见字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
int main()
{
char c;
cin >> c;
int i, j, k;
for ( i = 0; i < 3; i++)
{
for ( j = 0; j < 2-i; j++)
{
//2个空格
// 1个空格
// 没有空格

printf(" ");

}
for ( k = 0; k <(2*i+1) ; k++)
{
printf("%c", c);
//1个字符
//3个字符
//5个字符

}



printf("\n");
}



}

【深基2.例5】苹果采购

题目描述

现在需要采购一些苹果,每名同学都可以分到固定数量的苹果,并且已经知道了同学的数量,请问需要采购多少个苹果?

输入格式

输入两个不超过 \(10^9\) 正整数,分别表示每人分到的数量和同学的人数。

输出格式

一个整数,表示答案。保证输入和答案都在 int 范围内的非负整数。

样例 #1

样例输入 #1

1
5 3

样例输出 #1

1
15
1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a * b;
}

【深基2.例6】字母转换

题目描述

输入一个小写字母,输出其对应的大写字母。例如输入 q[回车] 时,会输出 Q。

输入格式

输出格式

样例 #1

样例输入 #1

1
q

样例输出 #1

1
Q
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
int main()
{
char c,d;
cin >> c;
d = c - 32;
cout << d;


}

【深基2.例7】数字反转

题目描述

输入一个不小于 \(100\) 且小于 \(1000\),同时包括小数点后一位的一个浮点数,例如 \(123.4\) ,要求把这个数字翻转过来,变成 \(4.321\) 并输出。

输入格式

一行一个浮点数

输出格式

一行一个浮点数

样例 #1

样例输入 #1

1
123.4

样例输出 #1

1
4.321
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//面向样例编程
#include<iostream>
#include<string>
using namespace std;

int main()
{

char a, b, c, d,f;
cin >> a >> b >> c >> d>>f;
cout << f << '.' <<c<< b << a;


}

【深基2.例8】再分肥宅水

题目描述

现在有 \(t\) 毫升肥宅快乐水,要均分给 \(n\) 名同学。每名同学需要 \(2\) 个杯子。现在想知道每名同学可以获得多少毫升饮料(严格精确到小数点后 \(3\) 位),以及一共需要多少个杯子。

输入格式

输入一个实数 \(t\) 和一个正整数 \(n\),使用空格隔开。

输出格式

输出两行。

第一行输出一个三位小数,表示可以获得多少毫升饮料。第二行输出一个正整数,表示一共需要多少个杯子。

样例 #1

样例输入 #1

1
500.0 3

样例输出 #1

1
2
166.667
6

提示

对于所有数据,\(0\leq t\leq 10000\) 且小数点后不超过 \(3\) 位,\(1\leq n\leq 1000\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;


int main()
{
double t;

int n;

cin>>t>>n;

printf("%.3lf\n%d",t/n,n*2);


}

【深基2.习2】三角形面积

题目描述

一个三角形的三边长分别是 \(a\)\(b\)\(c\),那么它的面积为 \(\sqrt{p(p-a)(p-b)(p-c)}\),其中 \(p=\frac{1}{2}(a+b+c)\)。输入这三个数字,计算三角形的面积,四舍五入精确到 \(1\) 位小数。

输入格式

第一行输入三个实数 \(a,b,c\),以空格隔开。

输出格式

输出一个实数,表示三角形面积。精确到小数点后 \(1\) 位。

样例 #1

样例输入 #1

1
3 4 5

样例输出 #1

1
6.0

提示

数据保证能构成三角形,\(0\leq a,b,c\leq 1000\),每个边长输入时不超过 \(2\) 位小数。

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;
double a,b,c,p,ans;
int main()
{
cin>>a>>b>>c;
p=(a+b+c)/2;
ans=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.1lf",ans);

}

【深基2.例12】上学迟到

题目描述

学校和 yyy 的家之间的距离为 \(s\) 米,而 yyy 以 \(v\) 米每分钟的速度匀速走向学校。

在上学的路上,yyy 还要额外花费 \(10\) 分钟的时间进行垃圾分类。

学校要求必须在上午 \(\textrm{8:00}\) 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。

由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。

输入格式

一行两个正整数 \(s,v\),分别代表路程和速度。

输出格式

输出一个 \(24\) 小时制下的时间,代表 yyy 最晚的出发时间。

输出格式为 \(\texttt{HH:MM}\),分别代表该时间的时和分。必须输出两位,不足前面补 \(0\)

样例 #1

样例输入 #1

1
100 99

样例输出 #1

1
07:48

提示

对于 \(100\%\) 的数据,\(1 \le s,v \le 10^4\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//分类天才
#include<iostream>
#include<string>
#include<cmath>
using namespace std;

int main()
{
int s;
int v;
cin >> s >> v;
const int t1 = 10;
int t = ceil(1.0*s / v) ;
int t2 = t1 + t;

int hh = t2 / 60;
int ff = t2 % 60;
if (hh<8&&ff==0)
{
cout << "0" << (8 - hh) << ":" << 00;
}
else if(hh<8&&ff>0&&60-ff>=10 )
{
cout << "0" << 7 - hh << ":" << 60 - ff;
}
else if (hh < 8 && ff>0 && 60 - ff < 10)
{
cout << "0" << 7 - hh << ":" <<"0"<< 60 - ff;
}
else if (hh>=8&&ff==0&&(24+8-hh)%24>=10)
{
cout << (24+8-hh)%24<< ":" << 00;
}
else if (hh>=8&&ff==0&&(24+8-hh)%24<10)
{
cout <<"0"<< (24 + 8 - hh) % 24 << ":" << 00;

}
else if(hh >= 8 && (23 + 8 - hh)%24 < 10&&60-ff>=10)
{
cout <<"0"<< (23 + 8 - hh) % 24 << ":" << 60 - ff;
}
else if (hh >= 8 && (23 + 8 - hh) % 24 < 10&&60-ff<10)
{
cout << "0" << (23 + 8 - hh) % 24 << ":" <<"0"<< 60 - ff;
}

else if (hh >= 8 && (23 + 8 - hh)%24 >= 10&&60-ff>=10)
{
cout << (23 + 8 - hh)%24 << ":" << 60-ff;
}

else if (hh >= 8 && (23 + 8 - hh) % 24 >= 10&&60-ff<10)
{
cout << (23 + 8 - hh) % 24 << ":" << "0"<<60 - ff;
}

}

大象喝水

题目描述

一只大象口渴了,要喝 \(20\) 升水才能解渴,但现在只有一个深 \(h\) 厘米,底面半径为 \(r\) 厘米的小圆桶 (\(h\)\(r\) 都是整数)。问大象至少要喝多少桶水才会解渴。

Update:数据更新,这里我们近似地取圆周率 \(\pi = 3.14\)

输入格式

输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深 \(h\) 和底面半径 \(r\),单位都是厘米。

输出格式

输出一行,包含一个整数,表示大象至少要喝水的桶数。

样例 #1

样例输入 #1

1
23 11

样例输出 #1

1
3

提示

数据规模与约定

对于全部的测试点,保证 \(1 \leq h \leq 500\)\(1 \leq r \leq 100\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>

using namespace std;

int h,r,a;

double t=3.14;

int main(){

cin>>h>>r;

a=20000/(t*r*r*h)+1;

cout<<a;
return 0;
}

小鱼的游泳时间

题目描述

伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 \(24\) 小时制计算),它发现自己从 \(a\)\(b\) 分一直游泳到当天的 \(c\)\(d\) 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

输入格式

一行内输入四个整数,以空格隔开,分别表示题目中的 \(a, b, c, d\)

输出格式

一行内输出两个整数 \(e\)\(f\),用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 \(f\) 应该小于 \(60\)

样例 #1

样例输入 #1

1
12 50 19 10

样例输出 #1

1
6 20

提示

对于全部测试数据,\(0\le a,c \le 24\)\(0\le b,d \le 60\),且结束时间一定晚于开始时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int x=c-a,y=d-b;
if(y<0)
{
x--;y+=60;

}
cout<<x<<" "<<y;


}

小玉买文具

题目描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 \(1\)\(9\) 角,而班主任给小玉的钱是 \(a\)\(b\) 角,小玉想知道,她最多能买多少只签字笔呢。

输入格式

输入只有一行两个整数,分别表示 \(a\)\(b\)

输出格式

输出一行一个整数,表示小玉最多能买多少只签字笔。

样例 #1

样例输入 #1

1
10 3

样例输出 #1

1
5

提示

数据规模与约定

对于全部的测试点,保证 \(0 \leq a \leq 10^4\)\(0 \leq b \leq 9\)

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;

int main(){
int a,b,m;
cin>>a>>b;
m=10*a+b;
cout<<m/19;

}

[NOIP2017 普及组] 成绩

题目背景

NOIP2017 普及组 T1

题目描述

牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是:

\[ \text{总成绩}=\text{作业成绩}\times 20\%+\text{小测成绩}×30\%+\text{期末考试成绩} \times 50\% \]

牛牛想知道,这门课程自己最终能得到多少分。

输入格式

三个非负整数 \(A,B,C\),分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是 \(100\) 分。

输出格式

一个整数,即牛牛这门课程的总成绩,满分也是 \(100\) 分。

样例 #1

样例输入 #1

1
100 100 80

样例输出 #1

1
90

样例 #2

样例输入 #2

1
60 90 80

样例输出 #2

1
79

提示

样例 1 说明

牛牛的作业成绩是 \(100\) 分,小测成绩是 \(100\) 分,期末考试成绩是 \(80\) 分,总成绩是 \(100 \times 20\%+100 \times 30\%+80 \times 50\%=20+30+40=90\)

样例 2 说明

牛牛的作业成绩是 \(60\) 分,小测成绩是 \(90\) 分,期末考试成绩是 \(80\) 分,总成绩是 \(60 \times 20\%+90 \times 30\%+80 \times 50\%=12+27+40=79\)

数据说明

对于 \(30\%\) 的数据,\(A=B=0\)

对于另外 \(30\%\) 的数据,\(A=B=100\)

对于 \(100\%\) 的数据,\(0≤A,B,C≤100\)\(A,B,C\) 都是 \(10\) 的整数倍。

1
2
3
4
5
6
7
8
9
10
#include<bits/stdc++.h>
using namespace std;
int main()
{
double a,b,c;
double s;
scanf("%lf%lf%lf",&a,&b,&c);
s=a*0.2+b*0.3+c*0.5;
printf("%.f",s);
}