2023级HAUT新生周赛(二)题解
A.小明的人生难题
签到题,直接输出即可。
#include<stdio.h> int main() { printf("%d", 520 * 1314 + 1024 / 2); return 0; }
B.小明的午餐难题
找到a,b,c,d中的最小值,并将其输出。
#include <stdio.h> int main() { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); int minnum = a; if (minnum > a) minnum = a; if (minnum > b) minnum = b; if (minnum > c) minnum = c; if (minnum > d) minnum = d; printf("%d", minnum); return 0; }
C.小明的内卷日
用数组存入写题花费的时间,并用qsort从小到大排序,然后每次将m减去需要花费最少时间的题目,直到m减少到小于零时退出,便可得到最优解。
#include <stdio.h> #include<stdlib.h> int cmp(const void *a, const void *b) { return *(int *)a > *(int *)b; } int a[100010]; int main() { int n; long long m; scanf("%d %lld", &n, &m); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } qsort(a, n, sizeof(int),cmp); int ans = 0; for (int i = 0; i < n; i++) { m -= a[i]; if (m >= 0) ans++; else break; } printf("%d", ans); }
D.小明的数字
先用char数组读入字符串s,再遍历判断s中的每一个字符,从第一个字符开始,当第i个字符比m小时,将m插入到第i个字符前面,就可以保证最后得到的值是最大值。
#include <stdio.h> char s[105]; int main() { int n; char m; scanf("%d", &n); scanf("%s %c", s, &m); int f = 0; for (int i = 0; i < n; i++) { if (m > s[i] && f == 0) { printf("%c", m); f = 1; } printf("%c", s[i]); } if (f == 0) printf("%c", m); return 0; }
E.小明的打怪游戏
由于先攻击血量高的怪物,所以在读取时可以先对血量ai大于k的值对k取模。取模后这个题就变成了一个排序问题,将血量高的排在前面,因为优先攻击血量高的怪物,血量相同时,按找下标排序,将下表较小的放在前面。就可以得到怪物死亡顺序了。
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; struct xp { int i, k; } a[N]; bool cmp(xp a, xp b) { if (a.k != b.k) { return a.k > b.k; } return a.i < b.i; } int main() { int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) { a[i].i = i; cin >> a[i].k; if (a[i].k % k == 0) a[i].k = k; else a[i].k %= k; } sort(a + 1, a + n + 1, cmp); for (int i = 1; i <= n; i++) { cout << a[i].i << ' '; } return 0; }
F.小明的出题日
这是一个寻找连续子串的问题,先将题目难度按照从大到小进行排序,然后从第一位开始遍历,当ai+1-ai的值小于等于k时,不断增大当前连续子串长度的值,当ai+1-ai的值大于k时或者循环结束时,更新连续字串长度的最大值,再将当前连续子串长度归零。最后找到最长连续子串长度,用n将其减去就得到了最少需要删除题目数量。
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int arr[110000]; int brr[110000]; int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d", &arr[i]); } qsort(arr, n, sizeof(int), cmp); for (int i = 1; i < n; ++i) { brr[i] = arr[i] - arr[i - 1]; } int ans = 1; int l = 1; for (int i = 1; i < n; ++i) { if (arr[i] - arr[i - 1] > m) { l = 1; } else l++; if (l > ans) ans = l; } printf("%d\n", n - ans); return 0; }
G.小明的数学游戏
根据算术基本定理 : 一个数一定能够能被分成若干个质数的乘积,所以只需要考虑k取质数的情况了;那么每次我们选择一个质数k;每次操作相当于对a与b的积乘k的立方,那么可以得出a*b的积一定是一个完全立方数,设t*t*t=a*b。对每个选取的质数进行分析 : p1选了a1次,对于a : p1这个质因子出现的次数x必须要在(a1<=x<=2*a1)这个范围内,那么对于b : p1这个质因子满足(a1 <= y <= 2 * a1) ,根据这个性质,可以得出t可以整除a,b;
#include<bits/stdc++.h> #define int long long #define endl '\n' using namespace std; signed main() { int t; ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin>>t; while(t--) { int x,y; cin>>x>>y; int z = x*y; int p = pow(z,1.0/3.0); int j = 0; bool flag = false; for(int i = -1;i<=1;++i) { j = p+i; if(z==j*j*j) { flag = true; break; } } if(flag) { if(x%j==0&&y%j==0) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } else { cout<<"No"<<endl; } } return 0; }
H.小明的幸运数
该题本质上是十进制数字转换为九进制数字。将输入进的十进制数字逐位计算得到九进制数字的每一位,最后再判断里面是否有4。
#include <bits/stdc++.h> using namespace std; void solve() { long long s; cin>>s; string ans=""; while(s) { char op=s%9+'0'; if(op>='4') op++; ans+=op; s/=9; } reverse(ans.begin(),ans.end()); cout<<ans; } int main() { cin.tie(0); cout.tie(0); int t=1; //cin>>t; while(t--) { solve(); } return 0; }