22 条题解

  • 24
    @ 2023-7-27 19:11:57

    还是解题三步走

    一、输入

    不用我多说了吧……

    int n, m, a[10001], b[10001], No = 1, num = 0;
    cin >> n >> m;
    for (int i = 1; i <= n; i ++)
        cin >> a[i];
    for (int i = 1; i <= m; i ++)
        cin >> b[i];
    

    二、分析

    1.观察题目:

    这是一道经典的贪心思想题目(读者:为什么呢? 作者:因为在贪心的课后作业里……)。

    2.贪心策略:

    把胃口值和饼干大小依次比较,如果饼干大小<胃口值,就把下一个饼干大小与胃口值比较。

    3.代码:

    sort(a + 1, a + n + 1);       //排序
    sort(b + 1, b + m + 1);
    for (int i = 1; i <= n; i ++)
    {
        if (a[i] >= b[No])        //No是胃口值的序号(参见输入部分)
        {
            No ++;
            num ++;
        }
        if (num == m)            //*
            break;
    }
    

    *:这个部分非常重要,没了它,就会80 WA。(读者:为什么? 作者:因为人数5人,输出了6人……)

    三、输出

    又是老生常谈……

    cout << num;
    

    四、完整代码

    呃呃呃,先别打,代码在路上了

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n, m, a[10001], b[10001], No = 1, num = 0;
        cin >> n >> m;
        for (int i = 1; i <= n; i ++)
            cin >> a[i];
        for (int i = 1; i <= m; i ++)
            cin >> b[i];
        sort(a + 1, a + n + 1);
        sort(b + 1, b + m + 1);
        for (int i = 1; i <= n; i ++)
        {
            if (a[i] >= b[No])
            {
                No ++;
                num ++;
            }
            if (num == m)
                break;
        }
        cout << num;
        return 0;
    }
    
    • @ 2023-9-10 16:31:36

      为啥你的代码就这么简单……我的直接干出来TLE(80AC,20TLE) 给你看看哈……

      #include <bits/stdc++.h>
      using namespace std;
      int n,a[10003],m,b[10003],x,sum;
      int main()
      {
          cin>>n>>m;
          for(int i=1;i<=n;i++)
          {
              cin>>a[i];
          }
          for(int i=1;i<=m;i++)
          {
              cin>>b[i];
          }
          sort(a+1,a+n+1);
          sort(b+1,b+m+1);
          x=1;
          if(m>n)
          {
              for(int i=1;i<=m;i++)
              {
                  for(int j=x;j<=n;j++)
                  {
                      if(a[j]>=b[i])
                      {
                          sum++;
                          a[j]=0;
                          x++;
                          break;
                      }
                  }
                  if(b[i]>a[n])
                  {
                      break;
                  }
                  sort(a+1,a+n+1);
              }
          }
          else
          {
              for(int i=1;i<=m;i++)
              {
                  for(int j=x;j<=n;j++)
                  {
                      if(a[j]>=b[i])
                      {
                          sum++;
                          a[j]=0;
                          x++;
                          break;
                      }
                  }
                  if(b[i]>a[n])
                  {
                      break;
                  }
                  sort(a+1,a+n+1);
              }
          }
          cout<<sum;
          return 0;
      }
      

      真的栓Q

    • @ 2024-3-16 18:30:31

      @ 哥们?人家让你用的是贪心不是穷举啊喂👀️

    • @ 2024-4-15 21:57:06

      @

      穷举TLE,递推UKE。

      模拟MLE,贪心还CE。

      歌里都唱着呢,很容易TLE的啊喂

  • 18
    @ 2023-9-24 12:25:35
    #include <bits/stdc++.h>//或者使用标准输入输出库和算法库
    using namespace std;
    int main()
    {
          int n,m,a[10005],b[10005];
          cin >> n >> m;
          for (int i = 1;i <= n;i++)
          {
                cin >> a[i];
          }
          for (int i = 1;i <= m;i++)
          {
                cin >> b[i];
          }
          sort (a + 1,a + n + 1);
          sort(b + 1,b + m + 1);
          int num = 0;
          for (int i = 1;i <= m;i++)//胃口
          {
                int p = 0;
                for (int j = 1;j <= n;j++)//饼干
                {
                      if (a[j] >= b[i])//能吃下去的最小大小饼干
                      {
                            a[j] = -1;//吃掉了
                            num++;//能吃上饼干的人多了一个
                            p = 1;
                            break;//去查看下一个人
                      }
                }
                if (p == 0)
                {
                      break;
                }
          }
          cout << num;//输出
          return 0;
    }/*p的作用是优化代码,
    如果这个胃口小的已经无法满足,
    那么下一个胃口更大的也无法满足,直接
    可以跳出循环,结束代码,
    可以节省0.1秒的时间,
    去掉也没有问题,
    用时也才区区0.3秒,
    优化后是0.2秒
    均可AC。简单易懂,
    别忘了顺手点个赞!!!!!
    要累死了【不容易】【不容易】
    唉唉唉
    */
    
    • @ 2023-9-24 12:28:33

      我要超过上面那个赞多的,请给我足够的支持,谢谢

  • 7
    @ 2023-4-22 14:14:14

    P1024【挑战题】吃饼干

    题目描述

    核晶学院后勤部准备了n片饼干,打算分发给m位学生,第i片饼干大小为a[i],第i位同学胃口值为b[i],每位同学只想吃下比自己胃口值大的饼干,请问这n片饼干,最多能让几位同学满足。


    思路

    可以先将a,b两个数组输入进去,再排序一下,最后逐位比较。

    输入:

    int n,m;
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        cin >> a[i];
    }
    for(int i = 1;i <= m;i++)
    {
        cin >> b[i];
    }
    

    排序:

    sort(a + 1,a + n + 1);
    sort(b + 1,b + m + 1);
    

    (需要有<algorithm>)

    逐位比较:

    for(int i = 1;i <= n && j <= m;i++)
    {
        if(a[i] >= b[j])
        {
            j++;
            sum++;
        }
    }
    cout << sum;
    

    参考代码:

    #include <iostream>//hetao3097453
    #include <algorithm>
    using namespace std;
    int a[10001],b[10001],sum;
    int main()
    {
        int n,m;
        cin >> n >> m;
        for(int i = 1;i <= n;i++)
        {
            cin >> a[i];
        }
        for(int i = 1;i <= m;i++)
        {
            cin >> b[i];
        }
        sort(a + 1,a + n + 1);
        sort(b + 1,b + m + 1);
        int j = 1;
        for(int i = 1;i <= n && j <= m;i++)
        {
            if(a[i] >= b[j])
            {
                j++;
                sum++;
            }
        }
        cout << sum;
        return 0;
    }
    

    hetao3097453

    2023年4月22日

    • 3
      @ 2023-11-25 19:54:35

      #P1024. 【挑战题】吃饼干

      题目描述

      核晶学院后勤部准备了n片饼干,打算分发给m位学生,第i片饼干大小为a[i],第i位同学胃口值为b[i],每位同学只想吃下大于等于自己胃口值的饼干,请问这n片饼干,最多能让几位同学满足。


      输入格式

      第一行输入两个正整数 n,m,表示饼干的数量和学生的数量。

      第二行内输入 nn 个正整数,用空格间隔,第i个整数表示第i片饼干的大小 ai。*

      第三行内输入 mm 个正整数,用空格间隔,第i个整数表示第i位同学的胃口大小bi


      输出格式

      学生可以吃上饼干的最多数量。


      #include <iostream> #include <algorithm> using namespace std; 正常 2 3部曲

      int n,m,a[10005],b[10005],num1,num2; //常规操作

      int main()
      {
      cin >> n >> m;
      for (int i = 1;i <= n;i++)
      cin >> a[i];
      for (int i = 1;i <= m;i++)
      cin >> b[i];//输入
      sort(a + 1,a + n + 1);
      sort(b + 1,b + m + 1);//排序
      while (num2 < m && num1 < n)
      {
      if (a[num1 + 1] < b[num2 + 1])
      {
      num1++;
      continue;
      }
      num1++;
      num2++;
      }
      cout << num2;
      return 0;
      }
      

      已AC,请勿抄袭 😄 😄 😄

      • 3
        @ 2023-2-27 17:15:12
        题目大意
                存在n个饼干,m个学生,只有饼干的大小大于学生的胃口,学生才愿意吃这个饼干,问最多有几个学生能吃上饼干。

        提示
                胃口最小的学生和最小的饼干匹配,如果最小的饼干满足不了胃口最小的学生,那就.....

        完整思路
                将饼干和学生都从小到大排序后,枚举每个饼干,如果当前的饼干可以满足当前学生的胃口,这位学生就能吃上饼干,累加,并转到下个学生,如果满足不了,就换下一块饼干继续判断。

        核心代码
        
        int j = 1;
        for (int i = 1; i <= n && j <= m; i++)
        {
            if (a[i] >= b[j])
            {
                j++;
                sum++;
            }
        }
        
        
        • 2
          @ 2024-4-14 21:41:01
          #include <bits/stdc++.h>//msh
          using namespace std;
          int main()
          {
              int n, m, a[10001], b[10001], No = 1, num = 0;
              cin >> n >> m;
              for (int i = 1; i <= n; i ++)
                  cin >> a[i];
              for (int i = 1; i <= m; i ++)
                  cin >> b[i];
              sort(a + 1, a + n + 1);
              sort(b + 1, b + m + 1);
              for (int i = 1; i <= n; i ++)
              {
                  if (a[i] >= b[No])
                  {
                      No ++;
                      num ++;
                  }
                  if (num == m)
                      break;
              }
              cout << num;
              return 0;
          }//先赞再看养成好习惯
          

          Copy

          • 1
            @ 2023-11-25 19:00:16

            双指针不回溯,O(n)解决

            #include<bits/stdc++.h>
            using namespace std;
            int a[10010],b[10010];
            int n,m,ans=0;
            int main(){
            	cin>>m>>n;
            	for(int i=1;i<=m;i++){
            		cin>>b[i];
            	}
            	for(int i=1;i<=n;i++){
            		cin>>a[i];
            	}
            	sort(a+1,a+n+1);
            	sort(b+1,b+m+1);
            	int j=1;
            	for(int i=1;i<=n;i++){
            		while(b[j]<a[i] && j<=m){
            			j++;
            		}
            		if(j<=m){
            			ans++;
            			j++;
            		}
            	}
            	cout<<ans;
            	return 0;
            }
            
            • 1
              @ 2023-9-9 22:41:44
              #include<bits/stdc++.h>//from hetao738467(禁止抄袭)
              using namespace std;
              int n,m,p=1,sum;
              int s[10005],b[10005];//不是我爱骂人,学生的英文首字母是S,饼干的是B。。。
              int main()
              {
                  cin>>n>>m;
                  for(int i=1;i<=n;i++)cin>>b[i];
                  sort(b+1,b+1+n);//饼干从小到大排序
                  for(int i=1;i<=m;i++)cin>>s[i];
                  sort(s+1,s+1+m);//学生胃口值从小到大排序
                  for(int i=1;i<=m;i++)//尝试满足每一位学生(优先满足胃口值小的)
                  {
                      for(;p<=n;p++)
                      {
                          if(s[i]<=b[p])//满足条件
                          {
                              sum++;
                              p++;
                              break;//第i名同学满足了
                              
                          }
                      }
                      if(p>n)break;//饼干用光了
                  }
                  cout<<sum;//输出
                  return 0;
              }
              
              • 1
                @ 2023-7-28 9:07:27
                #include <bits/stdc++.h>//dark王
                using namespace std;
                int n,m,ans,a[10001],b[10001];
                int main(){
                    cin >> n >> m; 
                    for (int i = 1;i <= n;i++) cin >> a[i];
                    for (int i = 1;i <= m;i++) cin >> b[i];
                    //输入部分
                    sort(a+1,a+n+1);//此步骤为了方便循环计算
                    for (int i = 1;i <= m;i++){   //遍历每位同学
                        for (int j = 1;j <= n;j++){  //遍历每块饼干
                            if (a[j] >= b[i]){  //条件
                                ans++;   //答案+1
                                a[j] = -1;  //就是说这块饼干没有了
                                break;    //避免重复
                            }
                        }
                    }
                    cout << ans;  //输出答案
                    return 0;
                    // dark王 特制,搬运狗趋势;
                }
                

                这题其实不难,就是将大于胃口值的最小值找出,一般用max比较,但在sort函数后,可以直接从小到大去找,然后就是细节;然后就是祝各位天天开心,天天愉快。Ok,goodbye,my home people!

                • -2
                  @ 2023-12-27 13:05:54

                  #include <bits/stdc++.h> using namespace std; int main() { int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i]; sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) { No ++; num ++; } if (num == m) break; } cout << num; return 0; }

                  • -2
                    @ 2023-10-2 16:58:38
                    #include <iostream>
                    #include <algorithm>
                    using namespace std;
                    int main(){
                        ios::sync_with_stdio(false);//没必要,纯粹裝B
                        cin.tie(0);cout.tie(0);//没必要,纯粹裝B
                        int n,m,a[10001],b[10001],cnt=1,ans=0;
                        cin>>n>>m;
                        for(int i=1;i<=n;i++)cin>>a[i];
                        for(int i=1;i<=m;i++)cin>>b[i];
                        sort(a+1,a+n+1);
                        sort(b+1,b+m+1);
                        for(int i=1;i<=n;i++){
                            if(a[i]>=b[cnt])cnt++,ans++;//一一比较,直到满足这个人
                            if(ans==m)break;
                        }
                        cout<<ans<<endl;
                        return 0;
                    }
                    
                  • -2
                    @ 2023-9-22 22:02:33

                    #include <iostream> #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; } //hetao1400874

                    • -2
                      @ 2023-9-3 15:35:12

                      yasuo👀️

                      #include <iostream>
                      #include <algorithm>
                      int main(){
                          int n,m,a[10005],b[10005],ans=0; std::cin>>n>>m; 
                          for(int i=0;i<n;i++)std::cin>>a[i]; for(int i=0;i<m;i++)std::cin>>b[i];
                          std::sort(a,a+n); std::sort(b,b+m); int* pos=b;
                          for(int i=0;i<n&&ans<m;i++)if(a[i]>=*pos){ans++; pos++;}
                          std::cout<<ans; return 0;}
                      
                      • -2
                        @ 2023-8-3 19:35:03
                        #include <bits/stdc++.h>
                        using namespace std;
                        int main()
                        {
                            int n, m, a[10001], b[10001], No = 1, num = 0;
                            cin >> n >> m;
                            for (int i = 1; i <= n; i ++)
                                cin >> a[i];
                            for (int i = 1; i <= m; i ++)
                                cin >> b[i];
                            sort(a + 1, a + n + 1);
                            sort(b + 1, b + m + 1);
                            for (int i = 1; i <= n; i ++)
                            {
                                if (a[i] >= b[No])
                                {
                                    No ++;
                                    num ++;
                                }
                                if (num == m)
                                    break;
                            }
                            cout << num;
                            return 0;
                        }
                        
                        
                        • -3
                          @ 2023-8-12 20:20:31

                          100 Accepted

                          # 状态分数 耗时 内存占用
                          -------------------------------------
                          #1 Accepted10 2ms 376 KiB
                          -
                          #2 Accepted10 3ms 376 KiB
                          #3 1ms 380 KiB
                          #4 2ms 376 KiB
                          #5 3ms
                          #6
                          #7 2ms 504 KiB
                          #8 3ms 376 KiB
                          #9
                          #10 4ms
                          • -3
                            @ 2023-4-27 21:17:01
                            #include <iostream>//by Chris knowledge
                            #include <algorithm>
                            using namespace std;
                            int a[10001],b[10001],sum;
                            int main()
                            {
                                int n,m;
                                cin >> n >> m;
                                for(int i = 1;i <= n;i++)
                                {
                                    cin >> a[i];
                                }
                                for(int i = 1;i <= m;i++)
                                {
                                    cin >> b[i];
                                }
                                sort(a + 1,a + n + 1);
                                sort(b + 1,b + m + 1);
                                int j = 1;
                                for(int i = 1;i <= n && j <= m;i++)
                                {
                                    if(a[i] >= b[j])
                                    {
                                        j++;
                                        sum++;
                                    }
                                }
                                cout << sum;
                                return 0;
                            }
                            
                            • -3
                              @ 2023-4-22 22:07:25
                              #include <bits/stdc++.h>
                              #define maxn 10001
                              using namespace std;
                              int n,m,ans,sta = 1,flag;
                              int a[maxn],b[maxn];
                              int main()
                              {
                                  scanf("%d%d",&n,&m);
                                  for(int i = 1;i <= n;i ++)
                                  {
                                      scanf("%d",&a[i]);
                                  }
                                  for (int i = 1;i <= m;i ++)
                                  {
                                      scanf("%d",&b[i]);
                                  }
                                  sort(a + 1,a + n + 1);
                                  sort(b + 1,b + m + 1);
                                  for (int i = 1;i <= n;i ++)
                                  {
                                      if (a[i] >= b[1])
                                      {
                                          flag = i;
                                          break;
                                      }
                                  }
                                  for (int i = flag;i <= n;i ++)
                                  {
                                      for (int j = sta;j <= m;j ++)
                                      {
                                          if (a[i] < b[j])
                                          {
                                              continue;
                                          }
                                          else
                                          {
                                              ans ++;
                                              sta = j + 1;
                                              break;
                                          }
                                      }
                                  }
                                  printf("%d",ans);
                                  return 0;
                              }
                              

                              //不优化是不是也能过啊

                              • -3
                                @ 2023-4-22 19:18:06
                                #include <iostream>//hetao3097453
                                #include <algorithm>
                                using namespace std;
                                int a[10001],b[10001],sum;
                                int main()
                                {
                                    int n,m;
                                    cin >> n >> m;
                                    for(int i = 1;i <= n;i++)
                                    {
                                        cin >> a[i];
                                    }
                                    for(int i = 1;i <= m;i++)
                                    {
                                        cin >> b[i];
                                    }
                                    sort(a + 1,a + n + 1);
                                    sort(b + 1,b + m + 1);
                                    int j = 1;
                                    for(int i = 1;i <= n && j <= m;i++)
                                    {
                                        if(a[i] >= b[j])
                                        {
                                            j++;
                                            sum++;
                                        }
                                    }
                                    cout << sum;
                                    return 0;
                                }
                                
                                • -4
                                  @ 2023-4-22 19:18:31
                                  #include <iostream>//hetao3097453
                                  #include <algorithm>
                                  using namespace std;
                                  int a[10001],b[10001],sum;
                                  int main()
                                  {
                                      int n,m;
                                      cin >> n >> m;
                                      for(int i = 1;i <= n;i++)
                                      {
                                          cin >> a[i];
                                      }
                                      for(int i = 1;i <= m;i++)
                                      {
                                          cin >> b[i];
                                      }
                                      sort(a + 1,a + n + 1);
                                      sort(b + 1,b + m + 1);
                                      int j = 1;
                                      for(int i = 1;i <= n && j <= m;i++)
                                      {
                                          if(a[i] >= b[j])
                                          {
                                              j++;
                                              sum++;
                                          }
                                      }
                                      cout << sum;
                                      return 0;
                                  }
                                  
                                  • -4
                                    @ 2023-4-22 19:18:21
                                    #include <iostream>//hetao3097453
                                    #include <algorithm>
                                    using namespace std;
                                    int a[10001],b[10001],sum;
                                    int main()
                                    {
                                        int n,m;
                                        cin >> n >> m;
                                        for(int i = 1;i <= n;i++)
                                        {
                                            cin >> a[i];
                                        }
                                        for(int i = 1;i <= m;i++)
                                        {
                                            cin >> b[i];
                                        }
                                        sort(a + 1,a + n + 1);
                                        sort(b + 1,b + m + 1);
                                        int j = 1;
                                        for(int i = 1;i <= n && j <= m;i++)
                                        {
                                            if(a[i] >= b[j])
                                            {
                                                j++;
                                                sum++;
                                            }
                                        }
                                        cout << sum;
                                        return 0;
                                    }
                                    

                                    信息

                                    ID
                                    17
                                    时间
                                    1000ms
                                    内存
                                    256MiB
                                    难度
                                    6
                                    标签
                                    递交数
                                    2687
                                    已通过
                                    928
                                    上传者