T1. 乘车费用
题目描述
星期天上午小红乘出租车去本市的奶奶家。出租车计价方案为: 3 3 3公里以内(包括 3 3 3公里)起步价是 13 13 13元,超过 3 3 3公里之后按 2.3 2.3 2.3元/公里计价,整个乘车途中另加 1 1 1元钱的燃油费。
已知:小红到奶奶家的路程为 N N N 公里,请你计算一下小红到奶奶家的出租车费用是多少元?
输入格式
输入一个整数 N N N,表示路程
输出格式
输出一个整数表示乘车 N N N公里后,出租车的费用(要求四舍五入保留整数),单位:元。
输入样例1
2
输出样例1
14
输入样例2
15
输出样例2
42
数据范围
对于
20
%
20\%
20%的数据
1
≤
N
≤
3
1 ≤ N ≤ 3
1≤N≤3 。
对于
100
%
100\%
100%的数据
1
≤
N
≤
30
1 ≤ N ≤ 30
1≤N≤30 ,其中存在
30
%
30\%
30%的数据需要考虑四舍五入。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int ans = 14; //3公里以内13,燃油费1
if(n > 3) {
int x = (n - 3) * 2.3 + 0.5; //+0.5处理四舍五入
ans += x;
}
cout << ans;
return 0;
}
T2. 竞争对手
题目描述
邻近高考,学校组织了一系列的考试,对每场考试的排名进行前后对比,以此来调动学生学习的积极性。
在经过了 2 场考试后,为了更好的提高学生的积极性,学校希望能够找出每位学生的竞争对手,使他们能够在竞争中一起成长。
竞争对手的定义:
在 2 2 2场考试的过程中只要2位学生的名次存在超过或被超过的情况,就认为他们是竞争对手。
例如第一场考试排名为 1 2 i 3 j 4 5 1\ 2\ i\ 3\ j\ 4\ 5 1 2 i 3 j 4 5 , i i i 排在 j 的前面,第二场考试排名为 1 2 j 3 i 4 5 1\ 2\ j\ 3\ i\ 4\ 5 1 2 j 3 i 4 5, j j j 排在 i i i的前面那么我们认为 i i i 和 j j j 为竞争对手。
请帮学校找出一共有几对竞争对手。
输入格式:
第一行,输入整数
n
n
n ,表示考生人数;
接下来 2 行,每行
n
n
n 个数,第
i
i
i 行的第
j
j
j 个数表示为第
i
i
i 场考试的第
j
j
j 名的学生排名(编号
1
−
n
1-n
1−n 之间);
输出格式:
输出一个整数,表示有几对竞争对手。
输入样例1:
5
3 4 5 2 1
2 3 4 1 5
输出样例1:
4
样例1解析
学生
1
1
1,第一场考试
2
,
3
,
4
,
5
2,3,4,5
2,3,4,5排在
1
1
1的前面,第二场考试
5
5
5排在
1
1
1的后面,所以
(
1
,
5
)
(1,5)
(1,5)是竞争对手;
学生
2
2
2,第一场考试
3
,
4
,
5
3,4,5
3,4,5排在2的前面,第二场考试
1
,
3
,
4
,
5
1,3,4,5
1,3,4,5排在
2
2
2的后面,所以
(
2
,
3
),(
2
,
4
),(
2
,
5
)
(2,3),(2,4),(2,5)
(2,3),(2,4),(2,5)是竞争对手;
学生
3
3
3,第一场考试前面没人,第二场考试
2
2
2排在
3
3
3的前面,所以
(
3
,
2
)
(3,2)
(3,2)是竞争对手;
学生
4
4
4,第一场考试
3
3
3排在
4
4
4的前面,第二场考试
2
,
3
2,3
2,3排在
4
4
4的前面,所以
(
4
,
2
)
(4,2)
(4,2)是竞争对手;
学生
5
5
5,第一场考试
3
,
4
3,4
3,4排在前面,第二场考试
1
,
2
,
3
,
4
1,2,3,4
1,2,3,4排在
5
5
5的前面,所以
(
5
,
1
),(
5
,
2
)
(5,1),(5,2)
(5,1),(5,2)是竞争对手;
重复的不算,像
(
3
,
2
)
(3,2)
(3,2)和
(
2
,
3
)
(2,3)
(2,3)算一个,一共有
(
1
+
3
+
1
+
1
+
2
)
÷
2
=
4
(1+3+1+1+2)\div 2 = 4
(1+3+1+1+2)÷2=4 对 。
数据范围:
对于
30
%
30\%
30%的数据,
1
≤
n
≤
10
1 ≤ n ≤ 10
1≤n≤10;
对于
70
%
70\%
70%的数据,
1
≤
n
≤
200
1 ≤ n ≤ 200
1≤n≤200;
对于
100
%
100\%
100%的数据,
1
≤
n
≤
5000
1 ≤ n ≤ 5000
1≤n≤5000。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int a[N], b[N];
int main()
{
int n, x;
cin >> n;
for(int i = 1; i <= n; i ++) {
cin >> x;
a[x] = i;
}
for(int j = 1; j <= n; j ++) {
cin >> x;
b[x] = j;
}
int ans = 0;
//枚举第i名同学和第j名同学
for(int i = 1; i <= n; i ++) {
for(int j = i + 1; j <= n; j ++)
{
//如果第一次考试i在j后,而第二场考试i在j前
//或者第一次考试i在j前,而第二次考试i在j后
if(a[i] > a[j] && b[i] < b[j] || a[i] < a[j] && b[i] > b[j])
{
//cout << "(" << i << "," << j << ")" << endl;
ans ++;
}
}
}
cout << ans;
return 0;
}
T3. 魔法数制
题目描述
魔法世界的数学发展的和人类世界不一样,在创造数制的时候,魔法先知用无穷大符号 ∞ ∞ ∞代替了 0 0 0,这也给后人们带来了许多烦恼。
先知制定的魔法世界数制规则如下:
- 每个位可用 ∞ ∞ ∞、 1..9 1..9 1..9,其大小比较规则为 1 < 2 < . . . < 9 < ∞ 1<2<...<9<∞ 1<2<...<9<∞
- 每个数由 n n n个位组成,默认前面都是 ∞ ∞ ∞,比如 n = 5 n=5 n=5时, 123 实际是 ∞ ∞ 123 123实际是∞∞123 123实际是∞∞123
- 在这个数制里,最小数是 111...11 111...11 111...11( n n n个),编号为 1 1 1;其次是 111...12 111...12 111...12( n n n个),编号为 2 2 2;最大数是 ∞ . . . ∞ ∞...∞ ∞...∞( n n n个),编号为 1 0 n 10^n 10n。
- 数制没有符号位,也即所有的数都是正的
现在你理解魔法数制了吗? 对于给定的 n n n和长度 < = n <=n <=n的一个数,求出该数在 n n n位魔法数制里的编号吧。
提示:
∞
∞
∞是utf8
字符,占用
3
3
3个字节
输入格式:
第一行一个数字
n
n
n,表示数制的长度
第二行一个长度
<
=
n
<=n
<=n位的数
x
x
x,由
1..9
、
∞
1..9、∞
1..9、∞组成
输出格式:
一个数字,表示输入魔法数的编号(编号是十进制表示,不是魔法数制)
输入样例1:
2
15
输出样例1:
5
样例1说明:最小是 11 11 11,然后 12 、 13 、 14 、 15 12、13、14、15 12、13、14、15,编号为 5 5 5。
输入样例2:
2
5
输出样例2:
95
样例2说明: 5 = ∞ 5 5=∞5 5=∞5,前面是 11..1 ∞ 11..1∞ 11..1∞, 21..2 ∞ 21..2∞ 21..2∞,…, 91..9 ∞ 91..9∞ 91..9∞, ∞ 1 、 ∞ 2 、 ∞ 3 、 ∞ 4 ∞1、∞2、∞3、∞4 ∞1、∞2、∞3、∞4,编号为 95 95 95.
数据范围:
样例1:
n
=
1
n=1
n=1
样例2:
n
=
2
n=2
n=2
样例3-4:
n
<
=
5
n<=5
n<=5,输入数长度
=
n
=n
=n,
x
x
x里只有
1..9
1..9
1..9
样例5-7:
n
<
=
10
n<=10
n<=10,
x
x
x里只有
1..9
1..9
1..9
样例8-10:
n
<
=
18
n<=18
n<=18,
x
x
x里有
1..9
1..9
1..9和
∞
∞
∞
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
char a[N];
int b[N];
int main()
{
int n, s, m = 0;
cin >> n;
cin >> a;
s = strlen(a);
//将字符串整理为数字形式,每个数字字符-1,∞替换为9
for(int i = s - 1; i >= 0; i --)
{
if(a[i] >= '0' && a[i] <= '9') b[m ++] = a[i] - '1';
else
{
b[m ++] = 9;
i -= 2;
}
}
//不足n位就进行补位
while(m < n) b[m ++] = 9;
//整理为10进制数
long long ans = 0;
for(int i = n - 1; i >= 0; i --) ans = ans * 10 + b[i];
//计算编号
cout << ans + 1 << endl;
}
T4. 图形打印
题目描述
小明今天在课上学习了矩阵,老师带着小明打印了许多花式图形,为了巩固知识老师布置了一道图形打印作业。
题目要求:输入这个整数 n n n,输出对应的图形。
图形如下:
填充规则:
- 以中间十字为基准,例如上图就是十字大小为 n = 4 n=4 n=4的图形;
- 十字的每个顶点都会延长两个
*
作为结尾,所以最后图形大小一定为 ( 2 n + 1 + 4 ) ∗ ( 2 n + 1 + 4 ) (2n+1+4) * (2n+1+4) (2n+1+4)∗(2n+1+4); - 十字的每个结尾的斜线连接的范围内,除十字都以
*
填充; - 其余位置以中间十字及斜线范围内的数填充完为基准进行
*
和空格交替填充。
输入格式:
输入一个整数 n n n ,表示十字大小;
输出格式:
输出对应图形;
输入样例1:
1
输出样例1:
* * *
* *** *
** **
** **
** **
* *** *
* * *
输入样例2:
4
输出样例2:
* * * * * * *
* * *** * *
* * ** ** * *
* *** *** *
* **** **** *
***** *****
** **
***** *****
* **** **** *
* *** *** *
* * ** ** * *
* * *** * *
* * * * * * *
数据范围:
样例1:
n
=
2
n=2
n=2;
样例2:
n
=
3
n=3
n=3;
样例1,3,5,7,9:
n
n
n为偶数;
样例1-5:
n
≤
20
n ≤20
n≤20;
样例6-10:
20
<
n
≤
100
20 < n ≤ 100
20<n≤100;
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 500;
char g[N][N];
int main()
{
int n, m;
cin >> n;
m = 2 * n + 5;
//交替填充空格和*
int flag = n % 2;
for(int i = 1; i <= m; i ++)
for(int j = 1; j <= m; j ++)
{
if(flag) g[i][j] = ' ', flag = !flag;
else g[i][j] = '*', flag = !flag;
}
//在中间部分填充*
int mid = m / 2 + 1, c = 0;
for(int i = 1; i <= m; i ++)
{
for(int j = mid - c; j <= mid + c; j ++)
g[i][j] = '*';
if(i < mid) c ++; //上半部分每次增加两个*
else c --; //下半部分每次减少两个*
}
//将十字部分填充空格
for(int i = mid - n; i <= mid + n; i ++) g[i][mid] = ' ';
for(int i = mid - n; i <= mid + n; i ++) g[mid][i] = ' ';
//输出图形
for(int i = 1; i <= m; i ++)
{
for(int j = 1; j <= m; j ++)
{
cout << g[i][j];
}
puts("");
}
return 0;
}