目录
[四.R 格式](#四.R 格式)
一.握手问题
题目链接:https://www.lanqiao.cn/problems/19695/learning/

1.题目讲解

2.代码实现
cpp
#include <iostream>
using namespace std;
int main()
{
cout << (50 * 49 - 7 * 6) / 2 << endl;
return 0;
}
二.小球反弹
题目链接:https://www.lanqiao.cn/problems/19732/learning/

1.题目讲解


2.代码实现
cpp
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
LL gcd(LL a, LL b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
LL x = 15 * 233333, y = 17 * 343720;
LL d = gcd(x, y);
LL a = x / d * 2 * 343720, b = y / d * 2 * 233333;
printf("%.2lf", sqrt(a * a + b * b));
return 0;
}
三.好数
题目链接:https://www.lanqiao.cn/problems/19709/learning/

1.题目讲解

直接暴力就可以了
2.代码实现
cpp
#include <iostream>
using namespace std;
bool check(int x)
{
int i = 1;
while(x)
{
if((x % 10) % 2 != i % 2) return false;
x /= 10;
i++;
}
return true;
}
int main()
{
int n; cin >> n;
int ret = 0;
for(int i = 1; i <= n; i++)
if(check(i))
ret++;
cout << ret << endl;
return 0;
}
四.R 格式
题目链接:https://www.lanqiao.cn/problems/19710/learning/

1.题目讲解

2.代码实现
cpp
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
string d;
int a[N], len, p;
void mul()
{
// 不断乘 2
int c = 0;
for(int i = 0; i < len; i++)
{
a[i] = a[i] * 2 + c;
c = a[i] / 10;
a[i] %= 10;
}
if(c) a[len++] = c;
}
int main()
{
cin >> n >> d;
len = d.size() - 1;
for(int i = 0, t = len - 1; i < d.size(); i++)
{
if(d[i] == '.') p = d.size() - i - 1; // 小数点后的位数
else a[t--] = d[i] - '0'; // 把浮点数逆序放在 a 数组中
}
// 乘 n 次 2
for(int i = 1; i <= n; i++) mul();
// 判断四舍五入
if(a[p - 1] >= 5)
{
int c = 1;
for(int i = p; i < len && c; i++)
{
a[i] = a[i] + c;
c = a[i] / 10;
a[i] %= 10;
}
if(c) a[len++] = c;
}
for(int i = len - 1; i >= p; i--) cout << a[i];
return 0;
}
五.宝石组合
题目链接:https://www.lanqiao.cn/problems/19711/learning/

1.题目讲解


2.代码实现
cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, a[N], cnt[N];
void get_d(int x)
{
for(int i = 1; i <= x / i; i++)
{
if(x % i == 0)
{
cnt[i]++;
if(i != x / i) cnt[x / i]++;
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
get_d(a[i]); // 预处理每一个数的约数
}
// 找最大的公约数
int x;
for(int i = 1e5; i >= 0; i--)
{
if(cnt[i] >= 3)
{
x = i;
break;
}
}
// 找出最小的三个数
sort(a + 1, a + 1 + n);
for(int i = 1, sum = 0; i <= n; i++)
{
if(a[i] % x == 0)
{
cout << a[i] << " ";
sum++;
}
if(sum == 3) break;
}
return 0;
}
六.数字接龙
题目链接:https://www.lanqiao.cn/problems/19712/learning/

1.题目讲解

2.代码实现
cpp
#include <iostream>
#include <vector>
using namespace std;
const int N = 15;
int n, k;
int g[N][N];
bool st[N][N], check[N][N][N][N];
vector<int> path;
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
bool dfs(int a, int b)
{
if(a == n - 1 && b == n - 1)
{
if(path.size() == n * n - 1) return true;
else return false;
}
st[a][b] = true;
for(int i = 0; i < 8; i++) // 保证字典序最小
{
int x = a + dx[i], y = b + dy[i];
if(x < 0 || x >= n || y < 0 || y >= n || st[x][y]) continue;
if((g[a][b] + 1) % k != g[x][y]) continue;
if(i % 2 == 1 && (check[a][y][x][b] || check[x][b][a][y])) continue;
path.push_back(i);
check[a][b][x][y] = true;
if(dfs(x, y)) return true;
path.pop_back();
check[a][b][x][y] = false;
}
st[a][b] = false;
return false;
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> g[i][j];
if(!dfs(0, 0)) cout << -1 << endl;
else
{
for(auto x : path) cout << x;
}
return 0;
}
七.拔河
题目链接:https://www.lanqiao.cn/problems/19713/learning/

1.题目讲解

2.代码实现
cpp
#include <iostream>
#include <set>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
LL a[N];
set<LL> mp;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
LL ret = 1e9;
for(int l = 2; l <= n; l++)
{
LL sum = 0;
// 把新产生的区间和,放进 set 中
for(int i = l - 1; i >= 1; i--)
{
sum += a[i];
mp.insert(sum);
}
sum = 0;
// 枚举右区间
for(int r = l; r <= n; r++)
{
sum += a[r];
// 在左边区域快速找出离 sum 最近的区间和
auto it = mp.lower_bound(sum);
if(it != mp.end()) ret = min(ret, *it - sum);
if(it != mp.begin())
{
it--;
ret = min(ret, sum - *it);
}
}
}
cout << ret << endl;
return 0;
}