2 条题解

  • 0
    @ 2026-7-20 1:42:38

    P1583 魔法照片——题解

    解题思路

    用结构体保存编号和当前权值。第一次按“权值降序、编号升序”排序,排序下标 ii 对应类别 imod10i\bmod10,加上相应额外权值;第二次使用同一比较规则排序,输出前 kk 个编号。

    复杂度分析

    两次排序,时间复杂度 O(nlogn)O(n\log n),空间复杂度 O(n)O(n)

    C++17 参考代码

    #include <bits/stdc++.h>
    using namespace std;
    struct Person{int id,w;};
    int main(){
        ios::sync_with_stdio(false);cin.tie(nullptr);
        int n,k;cin>>n>>k;
        int e[10];for(int i=0;i<10;i++) cin>>e[i];
        vector<Person>a(n);
        for(int i=0;i<n;i++){cin>>a[i].w;a[i].id=i+1;}
        auto cmp=[](const Person&A,const Person&B){return A.w!=B.w?A.w>B.w:A.id<B.id;};
        sort(a.begin(),a.end(),cmp);
        for(int i=0;i<n;i++) a[i].w+=e[i%10];
        sort(a.begin(),a.end(),cmp);
        for(int i=0;i<k;i++) cout<<a[i].id<<(i+1==k?'\n':' ');
        return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:38

      #include <bits/stdc++.h> using namespace std; struct Person{int id,w;}; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int n,k;cin>>n>>k; int e[10];for(int i=0;i<10;i++) cin>>e[i]; vectora(n); for(int i=0;i<n;i++){cin>>a[i].w;a[i].id=i+1;} auto cmp=[](const Person&A,const Person&B){return A.w!=B.w?A.w>B.w:A.id<B.id;}; sort(a.begin(),a.end(),cmp); for(int i=0;i<n;i++) a[i].w+=e[i%10]; sort(a.begin(),a.end(),cmp); for(int i=0;i<k;i++) cout<<a[i].id<<(i+1==k?'\n':' '); return 0; }

      • 1

      信息

      ID
      4928
      时间
      3000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者