2023武汉大学新生赛

发布时间 2023-10-07 15:34:28作者: MKleo

A题

 大意:对于一组数,首先执行一次操作,每次执行操作可以令每个数减一,如果有一种数字减到零(数字最小为零),再次执行该操作。

问:将所有数字都减到零。

解:排序,判断两个相邻的数是否相差大于1.

例:1 2 2 4,第一次操作,0 1 1 3,可执行第二次操作,0 0 0 2,可执行第三次,0 0 0 1,输出“no”;

 

E题签到,规律显然。

 

k题矩形分割

 

输入 2 4  ; 输出 4.

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main() {
    int n,m,sum=0,minn,maxn;
    scanf("%d%d",&n,&m);

    minn = min (n,m);
    maxn = max (n,m);

    while (minn>0)
    {
        sum+=minn;
        int t = minn; //中间存数
        minn = min(maxn-minn,minn);
        maxn = max(maxn-minn,t);
    }

    printf("%d",sum);

    return 0;
}

 

贪心想法:设矩形的长边为a,短边为b。

每次取边长为b的正方形,刨去b*b正方形后的矩形接着执行同样操作。

显然一个尽可能大的正方形,比多个小正方形单边长之和要小,答案记录短边的和即可。