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

全部评论

相关推荐

凉风落木楚山秋:哈工爷200也去吗
点赞 评论 收藏
分享
猫头夜鹰:图书管理系统能有面试就怪了,放十年前都不行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务