7 条题解

  • 9
    @ 2023-12-21 19:09:08

    这是一道典型的贪心例题。

    首先,确定贪心策略

    由于笑笑想花最少的钱来买到足够的贺卡,因此我么要优先选单价最便宜的,所以可以把各个贺卡的单价排序,优先选便宜的。(吐槽:笑笑这么穷吗?)

    接着,验证贪心策略

    不难证明,如果你选存货最多的,那根据样例就能发现错误,输出为:80。而如果选单价最便宜的,那就是正确答案,事实证明,贪心策略就是选单价最便宜的。

    最后,就是编码了,先定义一个结构体:

    struct T {
        int x, y;
    }a[10005];
    

    结构体名字为T是我的习惯(大佬不喜勿喷)

    使用这个结构体来存储每个商店贺卡的单价和存货。

    再接着就是排序了,直接对结构体的单价sort就行了(注:sort中要加cmp哦):

    inline bool cmp(T x, T y) { return x.x < y.x; }
    

    这是cmp的代码

    sort(a + 1, a + n + 1, cmp);
    

    这是sort

    另外我讲下sort

    sort是c++算法库algorithmalgorithm中的一个排序函数,它的作用是把元素按从大到小的顺序排序(注:这是默认情况下),当然,大家也可以自定义sort,比如我此篇题解的代码。至于cmpcmp,我就不讲了。并且此题解中的sort是可以让元素保持联动的。

    然后就是贪心了,根据贪心思路可以写出代码,定义一个指针ii,如果这个商店的贺卡被笑笑买完了,那就去第二便宜的商店买,以此类推(吐槽:商店存货可真少,都会被笑笑买完),直到已经买到了足够的贺卡,那输出答案即可

    所以这部分的代码是:

    while (m) {
            if (a[i].y == 0) i++;
            a[i].y--;
            ans += a[i].x;
            m--;
        }
    

    OK,下面上注释版ACAC CodeCode

    #include <bits/stdc++.h>
    using namespace std;
    struct T { // 定义结构体
        int x, y; // x表示单价,y表示存货
    }a[10005];
    inline bool cmp(T x, T y) { return x.x < y.x; }  // 自定义的cmp
    int main() {
        ios::sync_with_stdio(false); // 读入加速
        cin.tie(0);
        cout.tie(0);
        int m, n, ans = 0;
        cin >> m >> n;
        for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;
        // 以上是输入
        sort(a + 1, a + n + 1, cmp); // 对结构体排序,下面的贪心会用
        // 下面是贪心了,请大家认真看
        int i = 1;
        while (m) {
            if (a[i].y == 0) i++;
            a[i].y--;
            ans += a[i].x;
            m--;
        }
        cout << ans << endl;
        // 输出答案
        return 0;    // 好习惯
    }
    

    下面是你们最爱的精简无注释版ACAC CodeCode

    #include <bits/stdc++.h>
    using namespace std;
    struct T {
        int x, y;
    }a[10005];
    inline bool cmp(T x, T y) { return x.x < y.x; }
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        int m, n, ans = 0;
        cin >> m >> n;
        for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;
        sort(a + 1, a + n + 1, cmp);
        int i = 1;
        while (m) {
            if (a[i].y == 0) i++;
            a[i].y--;
            ans += a[i].x;
            m--;
        }
        cout << ans << endl;
        return 0;
    }
    

    码风好看吧!

    end,撒花

    • @ 2023-12-21 19:11:21

      各位看官,还不把赞留下

  • 3
    @ 2022-7-2 19:05:09

    由于sort正解太简单,所以这里来用 STL 里的 vector 来解决这题。

    AC 代码( 5ms ):

    #include <cstdio>
    #include <vector> // 向量
    #include <algorithm>
    using namespace std;
    
    struct QWQ{
    	int a , b;
    };
    vector <QWQ> qwq; //声明结构体向量
    int m , n , ans;
    
    bool cmp(QWQ a , QWQ b){ //比较
    	return a.a < b.a;
    }
    
    int main(void){
    	scanf("%d%d" , &m , &n);
    	while(n--){
    		int a , b;
    		scanf("%d%d" , &a , &b);
    		qwq.push_back((QWQ){a , b}); // 单价与数量加入qwq
    	}
    	sort(qwq.begin() , qwq.end() , cmp); //排序,单价低的排前面
    	for(int i = 0;i < qwq.size() && m > 0;i++){ //计算价钱,优先去单价低的商店
    		if(m > qwq[i].b){
    			ans += qwq[i].a * qwq[i].b;
    			m -= qwq[i].b;	
    		}
    		else{
    			ans += qwq[i].a * m;
    			m = 0;
    		}
    	}
    	printf("%d\n" , ans);
    }
    
  • 2
    @ 2023-6-23 8:24:45

    sort排序单价,为最便宜的

    #include <bits/stdc++.h>
    using namespace std;
    struct heka{ int a,b; };
    bool cmp(heka x,heka y){ return x.a<y.a; }
    int main(void){
        int m,n,pos=1,sum=0;
        heka a[1004];
        cin>>m>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i].a>>a[i].b;
        sort(a+1,a+n+1,cmp);
        while(m>0)
            if(a[pos].b>0){
                a[pos].b--;
                sum+=a[pos].a;
                m--;
            }
            else pos++;
        cout<<sum;
        return 0;
    }
    //已AC
    
    • 2
      @ 2023-5-21 10:09:55

      有hand就行(5ms)

      #include <bits/stdc++.h>
      using namespace std;
      struct heka{int dj,chl;};
      bool oiiaioiiiai(heka a,heka b){
          return a.dj<b.dj;
      }
      int m,n,cost;//cost n.花费
      heka a[101];
      int main(){   
          cin>>m>>n;
          for(int i=1;i<=n;i++)
              cin>>a[i].dj>>a[i].chl;
          sort(a+1,a+n+1,oiiaioiiiai);
          int zhizhen=1;
          while(m!=0){
              if(a[zhizhen].chl>0){
                  cost+=a[zhizhen].dj;
                  a[zhizhen].chl--;
                  m--;
              }else
                  zhizhen++;
          }cout<<cost;
          return 0;
      }//鸡你太美~
      
      </span>
      • 0
        @ 2023-4-17 20:35:06
        #include <bits/stdc++.h>
        using namespace std;
        int main()
        {
            int m,n,a[1050],b[1040],sum=0;
            cin >> m >> n;
            for(int i=1;i<=n;i++)
            {
                cin >> a[i] >> b[i];
            }
            for(int i=1;i<n;i++)
            {
                for(int j=1+i;j<=n;j++)
                {
                    if(a[i]>a[j])
                    {
                        int t=a[i];
                        a[i]=a[j];
                        a[j]=t;
                        int d=b[i];
                        b[i]=b[j];
                        b[j]=d;
                    }
                }
            }
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=b[i];j++)
                {
                    sum+=a[i];
                    m--;
                    if(m==0)
                    {
                        break;
                    }
                }
                if(m==0)
                {
                    break;
                }
            }
            cout << sum << endl;
            return 0;
        }
        
        • 0
          @ 2022-8-23 17:16:43

          用简单的sort:

          struct hh
          {
              int x,y;
          }a[1005];
          bool cmp(hh x1,hh x2)
          {
              return x1.x<x2.x;
          }
          
          sort(a+1,a+n+1,cmp);
          for (int i=1;i<=n;i++)
          {
              if (m>=a[i].y)
              {
                  ans+=a[i].x*a[i].y;
                  m-=a[i].y;
              }
              else
              {
                  ans+=m*a[i].x;
                  break;
              }
          }
          
          • -1
            @ 2022-4-24 16:14:25

            鼓励大家写题解,但注意题解格式。

            给代码两端加上这个会舒服一些

            ```cpp

            你的代码

            ```

            </span>

            这个点在键盘的左上角tab上面那个键,注意切换输入法

            #include<iostream>
            using namespace std;
            int main()
            {
                int n;
                cin>>n;//这是一个注释
                return 0;
            } 
            

            请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

            抄袭题解一经发现直接取消成绩。

            • 1

            信息

            ID
            727
            时间
            1000ms
            内存
            128MiB
            难度
            2
            标签
            递交数
            275
            已通过
            163
            上传者