2 条题解

  • 0
    @ 2022-11-19 16:30:28

    60 分

    • 每个数暴力查找前面的数,时间复杂度为 O(n2)O(n^2)
    • 每输入一个数就使用 sort() 排序一次,时间复杂度为 O(n×nlogn)O(n\times n\log{n}),即 O(n2logn)O(n^2\log{n})

    100 分

    考虑到这题 aia_i 范围比较小,可以使用计数排序,时间复杂度 O(max(ai)×n)O(max(a_i)\times n),对于这题即 100n100n

        for (int i = 1; i <= n; i++)
            cin >> a[i];
        int ans = 0;
        for (int i = 1; i <= n; i++)
        {
            cnt[a[i]]++;
            int nowr = 0, nowl = 0;
            for (int j = a[i] + 1; j <= 100; j++)
                nowr += cnt[j];
            for (int j = 1; j <= a[i] - 1; j++)
                nowl += cnt[j];
            ans += (nowr <= nowl);
        }
        cout << ans << "\n";
    
    • 0
      @ 2022-11-5 17:54:25

      开心的人数

      大致题意:一堆学生挨个进入教室,如果当前教室里面的人当中,分数比他小的人数>=分数比他大的人数,那么她就是开心的。(感觉不符合三好学生、四好少年的基本自我要求)

      思路:采用计数排序,从他的分数开始在数组里扫两遍(从前到他的分数,从末尾到他的分数),比他小的总和人数如果大于比他大的总和人数,那么sum增加,最后输出sum。

      上代码

      #include<bits/stdc++.h>
      using namespace std;
      int js[110],n,sum,maxx;
      bool pd(int x)
      {
      	int sum1=0,sum2=0;
      	for(int i=1;i<x;i++)
      		sum1+=js[i];  //扫一遍比他小的 
      	for(int i=101;i>x;i--)
      		sum2+=js[i];  //扫一遍比他大的 
      	if(sum1>=sum2) return 1;
      	else return 0;
      }
      int main()
      {
      	cin>>n;
      	for(int i=1;i<=n;i++)
      	{
      		int ls;
      		cin>>ls;  //读入当前这个人 
      		js[ls]++;  //计数 
      		if(pd(ls)==1)  //判断是否开心 
      			sum++;
      	}
      	cout<<sum;
      	return 0;
      }
      
      • 1

      信息

      ID
      1125
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      递交数
      76
      已通过
      21
      上传者