2 条题解

  • 1
    @ 2024-8-18 12:00:43

    验题人做法:

    考虑另外开一个数组记录原数组从小到大排序后的值,接着我们遍历原数组,找到第一个大于等于这个数在新数组里的位置,然后直接 nposn-pos 就是答案了。

    时间复杂度 O(nlogn)O(n\log n)

    #include <bits/stdc++.h>
    
    using u32 = unsigned;
    using i64 = long long;
    using u64 = unsigned long long;
    using i128 = __int128;
    
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(nullptr);
    
    	int n;
    	std::cin >> n;
    	std::vector<int> a(n), b(n);
    	for (int i = 0; i < n; i++) {
    		std::cin >> a[i];
    		b[i] = a[i];
    	}
    	sort(b.begin(), b.end());
    
    	for (int i = 0; i < n; i++) {
    		std::cout << n - (std::lower_bound(b.begin(), b.end(), a[i]) - b.begin()) << '\n';
    	}
    
    
    	return 0;
    }
    
    • 1
      @ 2024-8-18 11:01:43

      由于一个积木只能放在比他小或相等的上面,通过贪心思想,将积木按长度排序后,对相同长度取个高度最大值,然后按输入数据依次输出答案即可。

      inline void solve()
      {
          int n;
          cin>>n;
          vector<int>w(n+3),rem(n+3);
          map<int,int>ma;
          for(int i=1;i<=n;i++)
          {
              cin>>rem[i];
              w[i]=rem[i];
          }
          sort(&w[1],&w[n+1]);
          for(int i=1;i<=n;i++)
          {
              ma[w[i]]=max(ma[w[i]],n-i+1);
          }
          for(int i=1;i<=n;i++)
          {
              cout<<ma[rem[i]]<<"\n";
          }
      }
      
      
      • 1

      信息

      ID
      53
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      55
      已通过
      13
      上传者