练习题
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);
else
printf("%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;
}