2 条题解

  • 0
    @ 2023-6-2 22:47:30

    这道题目是真的坑,表述有很大的缺陷。很多人不理解样例是因为——返还的钱不能加在收到的钱中

    我们过一遍样例:以 dave 举例,他将 200200 元送给 33 个人,每个人分得 2003=66\lfloor \frac{200}{3} \rfloor=66 元,实际送出 66×3=19866 \times 3=198 元。后来他又收到了 owen 送的 500500 元,因此收到的钱比送出的钱多 500198=302500-198=302 元。其他人以此类推。

    注意到了吗?返还的钱没有起一点作用!但题目中没有说明导致很多人卡在样例上。我也是从洛谷某用户的口中得知这一信息

    收到的钱比送出的钱多多少,其实就是求每个人“赚”的钱。

    代码就很简单了,这里使用 map 记录每个人“赚”的钱。

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,p;
    string s[11],ss,k;
    map<string,int> out;//STL大法好!
    int main(){
        cin>>n;
        for (int i=1;i<=n;i++){
            cin>>s[i];
        }
        for (int i=1;i<=n;i++){
            cin>>ss>>m>>p;
            if (!p){//防止被0除
                continue;
            }
            k=ss;
            for (int i=1;i<=p;i++){
                cin>>ss;
                out[ss]+=m/p;
            }
            out[k]-=m/p*p;//计算实际送出的钱
        }
        for (int i=1;i<=n;i++){
            cout<<s[i]<<" "<<out[s[i]]<<endl;
        }
        return 0;
    }
    
    • 0
      @ 2022-8-20 16:45:00

      按着他说的一点点模拟即可:

      #include <iostream>
      #include <cstdio>
      #include <algorithm>
      using namespace std;
      int main()
      {
          int m,n,s,sum=m;
          cin>>m>>n;
          for (int i=1;i<=n;i++)
          {
              cin>>s;
              int a[sum+1],r=1;
              for (int j=1;j<=sum;j++)
              {
                  a[j]=s%10;
                  s/=10;
              }
              sort(a+1,a+sum+1);
              while (a[r]==a[r+1])
              {
                  r++;
              }
              sum-=r;
          }
          if (sum==1)
          {
              cout<<1;
          }
          else
          {
              cout<<-2;
          }
          return 0;
      }
      
      • @ 2023-6-2 22:11:12

        你题解交错地方了

    • 1

    【基础】贪婪的送礼者Greedy Gift Givers(USACO1.1)

    信息

    ID
    933
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    41
    已通过
    24
    上传者