SSY20240916提高组T1题解__贪心+大模拟

3 篇文章 0 订阅
1 篇文章 0 订阅

题面

题面描述

fe和xt在玩一个游戏, 在 n × m n\times m n×m的网格图上进行. 定义 ( a , b )    ,    ( c , d ) (a,b)\;,\;(c,d) (a,b),(c,d)见距离为 ∣ a − c ∣ + ∣ b − d ∣ |a-c|+|b-d| ac+bd
现在游戏按照以下步骤进行:

  1. xt选择 k k k个格子
  2. fe选择一个格子(不能选择步骤 1 1 1 中选过的格子)
  3. xt再选择一个格子

现在fe想让两人最后选的格子间距离最大, xt想让这个距离最小. 假设两人都按照最优方式选择, 询问对于 k = 0 , 1 , 2 , . . . , n × m − 1 k=0,1,2,...,n\times m-1 k=0,1,2,...,n×m1, 最后的距离是多少

输入输出格式

输入两个整数 n , m n,m n,m
输出 n × m n\times m n×m个整数, 表示对于不同 k k k的间距

样例输入

4 3

样例输出

3 3 4 4 4 4 4 4 5 5 5 5

数据范围

对于 100 % 100\% 100%的数据, 2 ≤ n × m ≤ 1 0 5 2\le n\times m\le10^5 2n×m105


题解

(没有循环, 只进行了这3个步骤)
我们先假设 k = 0 k=0 k=0
fe知道, 无论自己选哪一个格子, xt都会尽量选和它成对角线的另一个格子(如图)
(金黄色表示fe和xt选的不同情况的一对各点)
在这里插入图片描述
所以fe就要尽量选取靠近网格中间的格点, 以缩小和最远点的距离.
在这里插入图片描述
但是很明显xt也知道这件事, 所以当 k      ! =    0 k\;\;!=\;0 k!=0时, xt就会优先占据中间的格子
因此, 当中间的格子都被占据后, fe就会选择中间格子拓展出去一层的格子
易证得这种方式选出来的最大值最小
在这里插入图片描述
以此类推, 当这些格子也被全部占据后, fe就会选择继续向外拓展的格子(每次拓展之后最大距离都会 + 1 +1 +1)
所以有多少个和当前距离等价的格子, 就输出多少个距离(如下图)在这里插入图片描述
xt会从中间向外拓展, 占据相同颜色的格子(先占红色, 然后黄色, 然后绿色…)
最后算一下每种颜色格子的数量(大模拟), 和它到最远角落的距离, 输出即可
(这细节让我挂了 80 80 80分, 痛失榜二)

AC CODE

屎山代码

#include <bits/stdc++.h>
using namespace std;


int n,m;


int main(){
    cin >> n >> m;
    if(n>m){
        swap(n,m);
    }
    if(n==1||m==1){
        n=n*m;
        int mid=n/2;
        if(n%2==1){
            printf("%d ",mid);
            mid++;
            while(mid<=n-1){
                printf("%d %d ",mid,mid);
                mid++;
            }
        }else{
            while(mid<=n-1){
                printf("%d %d ",mid,mid);
                mid++;
            }
        }
    }else if(n==2||m==2){
        n=n*m;
        if(m%2==1){
            int mid=m/2;
            mid++;
            printf("%d %d ",mid,mid);
            mid++;
            while(mid<=m){
                printf("%d %d %d %d ",mid,mid,mid,mid);
                mid++;
            }
        }else{
            int mid=m/2+1;
            while(mid<=m){
                printf("%d %d %d %d ",mid,mid,mid,mid);
                mid++;
            }
        }
    }else{
        int nn=n%2;
        if(nn==0){
            nn=2;
        }
        int mm=m%2;
        if(mm==0){
            mm=2;
        }
        // printf("nn:%d mm:%d\n",nn,mm);
        int num=nn*mm;
        if(num==1){
        	num=0;
		}
        int N=(n-nn)/2,M=(m-mm)/2;
        int val=n/2+m/2;
        for(int x=1;x<=nn*mm;x++){
            printf("%d ",val);
        }
        int cntn=1;
        int cntm=1;
        while(cntn*2+nn<=n){
            num+=4;
            for(int x=1;x<=num;x++){
//            	cout << num << "awd";
                printf("%d ",val+cntn);
            }
            cntn++;
            cntm++;
            // N++;
        }
        // cout << endl << cntn << ' ' << cntm << endl;
//        cout << endl;
        while(cntm*2+mm<=m){
        	
            for(int x=1;x<=n*2;x++){
                printf("%d ",val+cntm);
            }
            cntm++;
        }
        // cout << endl << cntn << ' ' << cntm << endl;
//        cout << endl;
        while(N>=1){
            for(int x=1;x<=N*4;x++){
                printf("%d ",val+cntm);
            }
            cntm++;
            N--;
        }
        // cout << "END";
    }
    
    return 0;
}
### 回答1: 这个错误是因为 `legend` 函数的第一个输入参数 `ssy{1}` 和第二个输入参数 `ssy{2}` 的类型不正确导致的。`ssy` 可能是一个单独的数,而不是一个包含两个数的单元格数。请确保 `ssy` 是一个单元格数,并且包含两个数。你可以使用 `celldisp(ssy)` 查看 `ssy` 的类型和内容,以确保它符合要求。如果 `ssy` 不包含两个数,则需要修改代码以正确设置 `ssy` 的值。 ### 回答2: 这段代码出错的原因可能是在第31行的legend函数中的参数配置有误。根据给出的代码,legend函数应该是用于添加图例的。根据我对legend函数的了解,它的参数应该是一个字符串数,可以用于标识图中的每个数据系列。 在这个具体的错误中,可能是ssy这个变量没有被正确地定义或者存在问题。可以先检查一下代码前面是否有对ssy的定义,或者看一下ssy的数据类型是否正确。另外,在legend函数的参数中,0.2和0.3这两个数值可能是指定图例的位置或者大小,也可以检查一下这些数值是否符合函数的要求。 总之,确定代码中的ssy变量是否正确定义,并检查legend函数的参数是否符合函数要求,可以帮助解决这个错误。如果还有其他代码和错误信息提供,我们可以进行更准确的分析和回答。 ### 回答3: 在图表绘制过程中,调用了函数 legend(),并传入了参数 ssy{1}、ssy{2}、0.2和0.3。然而,在第31行中,函数调用出现了错误,导致程序无法正常执行下去。 出现错误的原因可能有多种可能性。首先,可能是因为函数 legend() 在当前环境中未定义或未正确加载,导致调用失败。此外,还有可能是传入的参数有误,比如 ssy{1} 和 ssy{2} 可能不存在或者数据类型不匹配。还有一种可能是传入的透明度参数0.2和0.3超出了函数允许的范围,导致错误。 为了解决这个问题,我们可以尝试以下几个步骤。首先,确认函数 legend() 是否在当前环境中正确加载,可以查看相关的库是否被正确导入。如果没有正确加载,需要加载相关的库或更新软件版本。其次,检查变量 ssy{1} 和 ssy{2} 是否存在或数据类型是否正确,可以使用打印语句或调试工具来检查变量的值和类型。最后,可以尝试更改透明度参数的值,确保其在合理的范围内。 总之,出现 sigma_masi_0707 (第 31 行) legend(ssy{1},ssy{2},0.2,0.3) 的错误可能是由函数未定义或加载失败、参数传递错误或透明度超出范围等原因引起的。通过逐步排除可能的问题,并针对性地进行修复,可以解决这个错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值