2 条题解

  • 0
    @ 2026-9-2 20:13:28

    这题感觉数据有点水。

    思路很简单:我们先统计出小 R 的排名,然后根据排名排座位。

    统计排名有两种方法:

    1. 使用一些排序算法将整个分数数组排序,因为保证分数不重复,所以直接循环遍历一遍小 R 的分数求出排名。这种方法虽然能过,但并不是最优方法。
    2. 直接循环统计一遍比小 R 分数高的人数,将人数 +1+1 即可得到排名。相对于排序的方法,时间复杂度更优。

    接下来就是排座位了。观察给出的图片,设排名为 pp ,得出结论:

    • cc 为奇数时,rrpp 的增大而增大。

    • cc 为偶数时,rrpp 的增大而减小。

    这里不给出模拟的方法,给出一个直接计算答案的方法:

    1. 直接算出 cc ,显然和 pn\frac{p}{n} 有关。但是如何计算呢?可以证明,cc 的值为 (p-1)/n+1
    2. 根据 cc 的奇偶算出 rr 的值。rr 显然和 p%n 有关,但我们要考虑 p%n =0= 0 的情况以及 cc 的奇偶性。
    • p%n =0=0cc 为奇数时,显然 r=nr = n
    • p%n =0=0cc 为偶数时,显然 r=1r = 1
    • p%n 1\ge 1cc 为奇数时,r=r = p%n
    • p%n 1\ge 1cc 为偶数时,r=r = n-(p%n)+1

    然后输出 ccrr 就切掉这题了。

    最后给出 AC 代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        int n,m,a[105],p=1;
        cin>>n>>m;
        for(int i=1;i<=n*m;i++) cin>>a[i];
        for(int i=2;i<=n*m;i++) if(a[i]>a[1]) p++;//O(nm)统计排名
        int c=(p-1)/n+1,r;
        if(c%2) r=p%n?p%n:n;
        else r=n-(p%n?p%n:n)+1;
        cout<<c<<' '<<r;
        return 0;
    }
    

    完结撒花!

    • 0
      @ 2025-12-21 11:25:33
      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
      	int n,m;scanf("%d%d",&n,&m);
      	int sum=1,x;scanf("%d",&x);
      	for(int i=1,y;i<n*m;i++)
      	{
      		scanf("%d",&y);
      		if(y>x)sum++;
      	}
      	int c=(sum+n-1)/n;
      	int r=sum-(c-1)*n;
      	if(c%2==0)r=n-r+1;
      	printf("%d %d\n",c,r);
      	return 0;
      }
      
      • 1

      信息

      ID
      1320
      时间
      1000ms
      内存
      512MiB
      难度
      5
      标签
      递交数
      153
      已通过
      54
      上传者