第一题:最大公约数放的可能有点前面,这题还是使用辗转相除,除此之外还需要判断一下ab的大小顺序
#include <stdio.h>
#include <math.h>
int main() {
long long a, b, n, c, m;
scanf("%lld %lld", &a, &b);
if (a > b) {
m = a, n = b;
} else {
m = b, n = a;
}
while (b != 0) {
c = a % b;
a = b;
b = c;
}
printf("%lld\n", m / a * n);
return 0;
}
第二题: 第二题我觉得是最好的一题,这一题虽然也是暴力,但是相对于大家写的直接暴力还是不一样的,因为总有数字会使ab数量相近,使得不能大数除余后小数%后是最小结果。而先取得大数a的范围再进行暴力对比,对于大家会不会是一种更新的思路呢。
#include <stdio.h>
int main() {
int n, x, y;
scanf("%d %d %d", &n, &x, &y);
int t = n / x;
int res = n % y;
for (int i = 0; i <= t; i++) {
int temp = (n - i * x) % y;
if (temp < res) {
res = temp;
}
}
printf("%d", res);
return 0;
}
第三题:这应该是最简单一题,不知道大家是怎么写的,因为是质数,所以一定不能是双数,那么只要将其变成双数就好了,本体多解,我是直接输出输入了。
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
printf("%d", n);
return 0;
}
第四题:这是我意料之外的难题,因为我只看了题目,没想到其实范围这么大,超时简直是轻而易举。当然好像群里有人想用动态规划写,确实可以但却不是最适合的。
任何关于数学的题目都可以回到本质剖解,斐波那契数列有一个性质,即前 n 项的平方和可以表示为 (fibn⋅fibn+1)(fibn⋅fibn+1),这个性质可以通过高中的数学归纳法证明。
我使用了一个递归函数 f 来计算斐波那契数列的第 x 项,并使用一个 map 来存储已经计算过的值以避免重复计算。递归的终止条件是当 x 为 1 或 2 时,直接返回 1,最后除余便可以得出答案了。
#include <stdio.h>
#include <string.h>
#define MOD 1000000007
typedef long long ll;
ll n, mod = MOD;
ll memo[100005] = {0};
ll f(ll x) {
if (memo[x] != 0) return memo[x];
ll y = x / 2;
ll temp1, temp2;
if (x % 2 == 0) {
temp1 = f(y) * f(y);
temp2 = f(y - 1) * f(y - 1);
} else {
temp1 = f(y) * f(y + 1);
temp2 = f(y - 1) * f(y);
}
memo[x] = (temp1 + temp2) % mod;
return memo[x];
}
int main() {
scanf("%lld", &n);
memo[1] = 1;
memo[2] = 1;
memo[3] = 2;
ll result = (f(n) * f(n + 1)) % mod;
printf("%lld\n", result);
return 0;
}
第5题:这题相对而言也是简单题目了,更考虑到大家对于数组的熟练度,只需要判断相邻是否相等加1就好了。
#include <stdio.h>
#include <string.h>
#define g 1000000007
int main() {
int t;
scanf("%d", &t);
while(t--) {
char s[100005];
scanf("%s", s);
int x = strlen(s);
for(int i = 0; i < strlen(s) - 1; i++) {
if(s[i] == s[i + 1]) x++;
}
printf("%d\n", x);
}
return 0;
}
第6题:这题也是另类的贪心暴力,我们只需要关心如何免费减少就好了,那么剩下的就是付费项目(这可是另外的价钱)
#include <stdio.h>
#define MAX_SIZE 1000000009
int n, x, sum = 0;
int a[MAX_SIZE];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
a[x]++;
if (x > 0 && a[x-1] < a[x]) sum++; // 如果前一个数小于当前数,sum++
if (x < MAX_SIZE - 1 && a[x+1] >= a[x]) sum--; // 如果后一个数大于等于当前数,sum--
}
printf("%d\n", sum);
return 0;
}

京公网安备 11010502036488号