列表

详情


WY66. 塔

描述

小易有一些立方体,每个立方体的边长为1,他用这些立方体搭了一些塔。
现在小易定义:这些塔的不稳定值为它们之中最高的塔与最低的塔的高度差。
小易想让这些塔尽量稳定,所以他进行了如下操作:每次从某座塔上取下一块立方体,并把它放到另一座塔上。
注意,小易不会把立方体放到它原本的那座塔上,因为他认为这样毫无意义。
现在小易想要知道,他进行了不超过k次操作之后,不稳定值最小是多少。

输入描述

第一行两个数n,k (1 <= n <= 100, 0 <= k <= 1000)表示塔的数量以及最多操作的次数。
第二行n个数,ai(1 <= a<= 104)表示第i座塔的初始高度。

输出描述

第一行两个数s, m,表示最小的不稳定值和操作次数(m <= k)
接下来m行,每行两个数x,y表示从第x座塔上取下一块立方体放到第y座塔上。

示例1

输入:

3 2
5 8 5

输出:

0 2
2 1
2 3

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 316KB, 提交时间: 2021-09-15

#include<stdio.h>

int main()
{
    int n,k;
    scanf("%d %d",&n,&k);
    int sz[n];
    int szk[k][2];
    int s,m=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&sz[i]);
    }
    
    for(int j=0;j<=k;j++)
    {
        int max = sz[0];
        int min = sz[0];
        int maxi = 0;
        int mini = 0;
        for(int i=1;i<n;i++)
        {
            if(sz[i]>max)
            {
                max = sz[i];
                maxi = i;
            }
            if(sz[i]<min)
            {
                min = sz[i];
                mini = i;
            }
        }
            s = max-min;
            if(s == 0 ||s==1) 
                break;
            szk[j][0] = maxi;
            szk[j][1] = mini;
            sz[maxi]--;
            sz[mini]++;
            m++;
    }
        if(m>k)
            m--;
        printf("%d %d\n",s,m);
        for(int i=0;i<m;i++)
        {
            printf("%d %d\n",szk[i][0]+1,szk[i][1]+1);
        }
        return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2020-12-14

#include<stdio.h>
int main(void)
{
    int n,k,i;
    scanf("%d %d",&n,&k);
    int height[100];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&height[i]);
    }
    int b[k][2];
    int heightest=0;
    int lowest=10000;
    int h_num;
    int l_num;
    int r=0;
    while(heightest!=lowest&&r<=k)
    {
        heightest=0;
        lowest=10000;
        for(int i=0;i<n;i++)
        {
            if(height[i]>heightest)
            {
                heightest=height[i];
                h_num=i;
            }
            if(height[i]<lowest)
            {
                lowest=height[i];
                l_num=i;
            }
        }
        height[h_num]--;
        height[l_num]++;
        b[r][0]=h_num+1;
        b[r][1]=l_num+1;
        r++;
    }
    r--;
    printf("%d %d\n",heightest-lowest,r);
    for(int i=0;i<r;i++)
    {
        printf("%d %d\n",b[i][0],b[i][1]);
    }
    return 0;
}

上一题