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;
}

查看6道真题和解析