练习题
P1480 A/B Problem
# A/B Problem
## 题目描述
输入两个整数 $a,b$,输出它们的商。
## 输入格式
两行,第一行是被除数,第二行是除数。
## 输出格式
一行,商的整数部分。
## 样例 #1
### 样例输入 #1
```
10
2
```
### 样例输出 #1
```
5
```
## 提示
$0\le a\le 10^{5000}$,$1\le b\le 10^9$。
#include<bits/stdc++.h>
using namespace std;int main()
{string a;int num[5001] = { 0 }, ans[5001] = { 0 };int b, len, res = 0;cin >> a >> b;len = a.length();for (int i = 0; i < len; i++){num[i] = a[len - 1 - i] - '0';}for (int i = len - 1; i >= 0; i--){res = res * 10 + num[i];ans[i] = res / b;res %= b;}while (ans[len] == 0 && len > 0)len--;for (int i = len; i >= 0; i--){cout << ans[i];}return 0;
}
P1109 学生分组
# 学生分组
## 题目描述
有 $n$ 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 $R$ 和下界 $L\ (L \le R)$,每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 $N$ 组学生的人数都在 $[L,R]$ 中。
## 输入格式
第一行一个整数 $n$,表示学生组数;
第二行 $n$ 个整数,表示每组的学生个数;
第三行两个整数 $L,R$,表示下界和上界。
## 输出格式
一个数,表示最少的交换次数,如果不能满足题目条件输出 $-1$。
## 样例 #1
### 样例输入 #1
```
2
10 20
10 15
```
### 样例输出 #1
```
5
```
## 提示
### 数据范围及约定
对于全部数据,保证 $1\le n \le 50$。
#include<bits/stdc++.h>
using namespace std;
int main()
{int sum = 0, r, l, n, x = 0, y = 0;int a[51] = { 0 };cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}cin >> l >> r;for (int i = 1; i <= n; i++){sum += a[i];if (a[i] > r)x += a[i] - r;if (a[i] < l)y += l - a[i];}if (sum<n * l || sum>n * r){printf("-1");return 0;}if (x > y)printf("%d", x);elseprintf("%d", y);return 0;
}
P1421 小玉买文具
# 小玉买文具
## 题目描述
班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 $1$ 元 $9$ 角,而班主任给小玉的钱是 $a$ 元 $b$ 角,小玉想知道,她最多能买多少只签字笔呢。
## 输入格式
输入只有一行两个整数,分别表示 $a$ 和 $b$。
## 输出格式
输出一行一个整数,表示小玉最多能买多少只签字笔。
## 样例 #1
### 样例输入 #1
```
10 3
```
### 样例输出 #1
```
5
```
## 提示
#### 数据规模与约定
对于全部的测试点,保
证 $0 \leq a \leq 10^4$,$0 \leq b \leq 9$。
#include<bits/stdc++.h>
using namespace std;int main()
{int a, b, c;cin >> a >> b;c = a * 10 + b;int ans = c / 19;cout << ans;}
P2708 硬币翻转
# 硬币翻转
## 题目描述
有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用 $1$ 表示,背面朝上的用 $0$ 表示。
现在要求从这行的第一个硬币开始,将**从第一个硬币开始的前若干个硬币**同时翻面,求如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
## 输入格式
一个字符串,由 $0$ 和 $1$ 组成,表示硬币的初始状态。
## 输出格式
一个整数,表示要翻转的最少次数。
## 样例 #1
### 样例输入 #1
```
10
```
### 样例输出 #1
```
2
```
## 提示
### 样例解释
- 第 $1$ 次翻转:把第一个硬币翻到反面,字符串为 $00$;
- 第 $2$ 次翻转:把第一、二个硬币一起翻到正面,字符串为 $11$,翻转完成,输出 $2$。
### 数据范围
记 $n$ 表示硬币的总个数,
- 对于 $20\%$ 的数据,$1\le n\leq10$;
- 对于 $50\%$ 的数据,$1\le n\leq10^4$;
- 对于 $100\%$ 的数据,$1\le n\leq10^6$。
#include<bits/stdc++.h>
using namespace std;int main()
{string s;cin >> s;while (s.back() == '1')s.pop_back();if (!s.length()){cout << '0';return 0;}int ans = 0;for (int i = 1; i <= s.length(); i++){if (s[i] != s[i - 1])ans++;}cout << ans;return 0;
}
B3849 [GESP样题 三级] 进制转换
# [GESP样题 三级] 进制转换
## 题目描述
小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用 `A` 表示 $10$、`F` 表示 $15$。如果扩展到用 `Z` 表示 $35$,岂不是可以表示 $36$ 进制数了嘛!
所以,你需要帮助她写一个程序,完成十进制转 $R$ 进制($2\le R\le 36$)的工作。
## 输入格式
输入两行,第一行包含一个正整数 $N$,第二行包含一个正整数 $R$,保证 $1\le N\le 10^6$。
## 输出格式
输出一行,为 $N$ 的 $R$ 进制表示。
## 样例 #1
### 样例输入 #1
```
123
25
```
### 样例输出 #1
```
4N
```
#include<bits/stdc++.h>
using namespace std;
int x, r, s;
int a[1001];
void func(int num, int step)
{if (num < r){a[step] = num;s = step;return;}int i = num % r;a[step] = i;int j = num / r;func(j, step + 1);
}
int main()
{cin >> x >> r;func(x, 1);for (int i = s; i >= 1; i--){if (a[i] <= 9){cout << (char)(a[i] + '0');}else{cout << (char)(a[i] + 55);}}return 0;
}