1 条题解

  • 0
    @ 2025-8-24 22:33:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar MY(一名蒟蒻)
    你数据结构都用错了,怎么改都是没用的。

    搬运于2025-08-24 22:33:51,当前版本为作者最后更新于2021-09-22 13:44:20,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P7873 「SWTR-07」Scores(easy version)

    小清新构造。

    我觉得看简化题意不如看原题面,有代入感会比较好理解题目。

    不能让一个人的所有科目分数都不比另一个人高。

    无解的情况只有有多个人且只有一个科目的时候。

    做题一定要关注数据范围。

    注意到最多只有 100100 科和一百个人。那我们可以假定每一科每个人的分数互不相同来让题目变得简单一点。这里的语序很重要。

    假设有个人在某一科有 xx 个人比他高,那么他只要在另一科考得比这 xx 个人都高就好。

    讲到这里思路已经呼之欲出了。我赛时的想法是安排相邻的两科的分数一科升序一科降序。写题解的时候又想到让前面 n1n-1 科全部升序或者降序,最后一科反过来就好。这种思路就留给读者实现了我懒得写了

    代码实现非常容易,没啥核心代码就放整个了。以下是赛时代码。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    int sco[110][110];
    
    int main()
    {
    //  freopen("work.in","r",stdin); freopen("work.out","w",stdout);
        int t,n,m;
        scanf("%d%d",&t,&t);
        while(t--)
        {
        	scanf("%d%d",&n,&m);
        	if(m == 1 && n > 1) puts("NO");
        	else
    		{
    			puts("YES");
    			for(int j=1;j<=m;j++)
    				for(int i=1;i<=n;i++)
    				{
    					if(j&1) sco[i][j]=i;
    					else sco[i][j]=n-i+1;
    				}
    			for(int i=1;i<=n;i++)
    			{
    				for(int j=1;j<=m;j++) printf("%d ",sco[i][j]);
    				puts("");
    			}
    		}
    	}
    //  fclose(stdin); fclose(stdout);
        return 0;
    }
    

    Thank you for your reading !

    • 1

    信息

    ID
    5687
    时间
    200ms
    内存
    16MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者