1 条题解

  • 0
    @ 2025-8-24 21:16:23

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar FFTotoro
    龙猫

    搬运于2025-08-24 21:16:22,当前版本为作者最后更新于2024-06-10 11:35:32,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    整点烂活。

    因为我们不知道表格的每一列是整数还是字符串,所以我们可以用 std::variant<int,std::string>(需要 C++17,作用为存储一个整数字符串)来存储表格中的元素。

    把所有条件都存储在一个 std::vector 里面。因为如果条件都一样要保持原来的顺序,所以使用 std::stable_sort 进行排序,cmp 函数里当所有条件都一样时就返回 false 即可。

    放代码:

    #include<bits/stdc++.h>
    using namespace std;
    inline vector<variant<int,string> > f(string s){
      vector<variant<int,string> > a;
      for(int i=0,j;i<s.length();i=j+1){
        string t;
        for(j=i;j<s.length()&&s[j]!=',';j++)t+=s[j];
        bool D=true; // 是否全是数字
        for(char i:t)D&=isdigit(i);
        if(D)a.emplace_back(stoi(t));
        else a.emplace_back(t);
      }
      return a;
    } // 对输入的字符串进行解析
    int main(){
      ios::sync_with_stdio(false);
      cin.tie(0); cout.tie(0);
      int n; string h; cin>>n>>h;
      auto H=f(h);
      vector<string> t(n-1);
      for(auto &i:t)cin>>i;
      vector<vector<variant<int,string> > > T(n-1);
      for(int i=0;i<n-1;i++)T[i]=f(t[i]);
      vector<pair<int,int> > C;
      int m; cin>>m;
      for(int i=0;i<m;i++){
        string s; cin>>s;
        for(int j=0;j<H.size();j++)
          if(s.substr(0,s.length()-1)==get<string>(H[j])){
            C.emplace_back(j,s.back()=='+'); break;
          } // 判断是什么类型的条件
      }
      stable_sort(T.begin(),T.end(),[&](auto x,auto y){
        for(auto [a,s]:C)
          if(x[a]!=y[a])return s?x[a]<y[a]:x[a]>y[a];
        return false;
      }); // 进行排序
      cout<<h<<endl;
      for(auto x:T)
        for(int j=0;j<x.size();j++){
          if(get_if<int>(&x[j]))x[j]=to_string(get<int>(x[j]));
          cout<<get<string>(x[j])<<",\n"[j==x.size()-1];
        }
      return 0;
    }
    
    • 1

    信息

    ID
    10324
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者