1.大小写转换
大写的A在ascii码中对应的值是65 小写a对应的值是97 中间差了32 所以我们只需要对相应的大写字符的ascii码值 + 32移位即可得到答案
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string s;
int main()
{
cin >> s;
for (int i = 0; i < s.size(); i ++ ) printf("%c", s[i] + 32);
return 0;
}
2.不合群数
题目要求我们找到[2,b]之间的最大不合群数
首先我们要知道2到b之间最大的不合群数是b-1 因为b能被b整除
现在我们考虑质数 因为质数只被1和本身整除 所以质数只要大于a就一定满足不合群数的条件
题目中给出10亿内相邻质数的差值不超过300 我们至多枚举300次就一定能找到一个答案 但是不合群数不一定是质数 所以我们需要对b之前的300个数依次枚举是否能被2到a整除 如果在找到质数前找到一个不能被2到a整除的数 那么这个数就是最大的不合群数 不然就是300区间内的最大质数为不合群数 反之没有不合群数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
for (int i = b; i > a; i --)
{
bool flag = true;
for (int j = 2; j <= a && j * j <= i; j ++ )
{
if (i % j == 0)
{
flag = false;
break;
}
}
if (flag)
{
cout << i << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}
3.最短距离
第一问:是否任意两个同类点之间距离都是0.
第二问:若第一问为true 求出任意两类点之间的最短距离
第一问 边权大于0的边都没有意义 考虑只保留边权为0的边 问题转化为 对于所有 1 <= i <= k i类点连通 使用并查集做
对于第二问 此时已知任意两个同类点距离都是0 则同类点可以缩成一个点 一条边(u, v, w) 转变为 (tu, tv, w) tu表示u的类别 这样只有k个点 用floyd一次就可求出答案
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010, M = 510, INF = 0x3f3f3f3f;
int n, m, ks;
int p[N], d[M][M];
int id[N];
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
bool check()
{
for (int i = 2; i <= n; i ++ )
if (id[i] == id[i - 1] && find(i) != find(i - 1))
return false;
return true;
}
int main()
{
scanf("%d%d%d", &n, &m, &ks);
for (int i = 1; i <= n; i ++ ) p[i] = i;
for (int i = 1, j = 0; i <= ks; i ++ )
{
int c;
scanf("%d", &c);
while (c -- ) id[ ++ j] = i;
}
memset(d, 0x3f, sizeof d); // 初始化
for (int i = 1; i <= ks; i ++ ) d[i][i] = 0;
while (m -- )
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (!c) p[find(a)] = find(b);
int x = id[a], y = id[b];
d[x][y] = d[y][x] = min(d[x][y], c);
}
if (!check()) puts("No");
else
{
puts("Yes");
// floyd
for (int k = 1; k <= ks; k ++ )
for (int i = 1; i <= ks; i ++ )
for (int j = 1; j <= ks; j ++ )
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
for (int i = 1; i <= ks; i ++ )
{
for (int j = 1; j <= ks; j ++ )
{
int t = d[i][j];
if (t == INF) t = -1;
printf("%d ", t);
}
puts("");
}
}
return 0;
}