• C++
  • 为了气死黄老师 我决定把这周算法班的作业题解公开

  • @ 5 months ago

看评论区(黄老师汗流浃背了吧)

2 comments

  • @ 5 months ago

    他不看OJ

    • @ 5 months ago

      1.P2695 骑士的工作

      #include <stdio.h>
      #include <algorithm>
      
      int sum = 0, cnt = 0, cnt_dangerous = 0;
      
      int main() {
          
          int a,b;
          scanf("%d%d",&a,&b);
          
          int n[a],m[b];
          
          for(int i = 0; i < a; ++i) {
              
              scanf("%d",&n[i]);
          }
          
          for(int i = 0; i < b; ++i) {
              
              scanf("%d",&m[i]);
          }
          
          
          std::sort(n, n + a);
          std::sort(m, m + b);
          
          for(int i = 0; cnt < a && i < b; ++i) {
              
              if(m[i] >= n[cnt_dangerous]) {
                  
                  ++cnt;
                  ++cnt_dangerous;
                  sum += m[i];
              }
          }
          
          if(cnt < a) {
              
              printf("you died!");
              
              return 0;
          }
          
          printf("%d",sum);
          
          return 0;
      }
      

      2.B3959 [GESP202403 四级] 做题

      #include <stdio.h>
      #include <algorithm>
      
      int sum = 0, cnt = 1;
      
      int main() {
          
          int a;
          scanf("%d",&a);
          
          int n[a];
          
          for(int i = 0; i < a; ++i) {
              
              scanf("%d",&n[i]);
          }
          
          std::sort(n, n + a);
          
          for(int i = 0; i < a; ++i) {
              
              if(n[i] >= cnt) {
                  
                  ++sum;
                  ++cnt;
              }
          }
          
          printf("%d",sum);
          
          return 0;
      }
      
      • @ 5 months ago

        剩下的待会做完发

      • @ 5 months ago

        4.P10452 货仓选址

        #include <stdio.h>
        #include <algorithm>
        
        int sum = 0;
        
        int main() {
            
            int a;
            scanf("%d",&a);
            
            int n[a];
            
            for(int i = 0; i < a; ++i) {
                
                scanf("%d",&n[i]);
            }
            
            std::sort(n, n + a);
            
            for(int i = 0; i < a; ++i) {
                
                int t = n[i] - n[a >> 1];
                
                if(t < 0) {
                    
                    t -= t + t;
                }
                
                sum += t;
            }
            
            printf("%d",sum);
            
            return 0;
        }
        
      • @ 5 months ago

        吃完饭回来了 我必须把剩下两题做完

      • @ 5 months ago

        要不我发完题解顺便把思路讲了得了 进一步引发黄老师高血压

      • @ 5 months ago

        3.P1376 [USACO05MAR] Yogurt factory

        #include <stdio.h>
        
        struct node{
            
            int last_money, s_now;
            
        }minn;
        
        unsigned long long sum = 0;
        int week, s, money, how_many;
        
        int main() {
            
            scanf("%d%d%d%d",&week,&s,&money,&how_many);
            
            sum += money * how_many;
            
            minn.last_money = money;
            minn.s_now = s;
            
            for(int i = 1; i < week; ++i, minn.s_now += s) {
                
                scanf("%d%d",&money,&how_many);
                
                if(minn.last_money * how_many + how_many * minn.s_now < money * how_many) {
                    
                    sum += minn.last_money * how_many + how_many * minn.s_now;
                }
                
                else {
                    
                    minn.last_money = money;
                    minn.s_now = 0;
                    
                    sum += money * how_many;
                }
            }
            
            printf("%llu",sum);
            
            return 0;
        }
        
      • @ 5 months ago

        目前最有含金量的一题

      • @ 5 months ago

        不过马上就不是了 因为还有一题提高- 做你妈

      • @ 5 months ago

        算了不做了 应该做不出来

      • @ 5 months ago

        哎呀我真的是曹操了 就手贱非要试一下 奖杯来的明天还要上课 真的马勒戈壁的 日牛魔啊 还tm没做出来😅

      • @ 5 months ago
        #include<stdio.h>
        #include<math.h>
        #include<vector>
        
        using std::vector;
        
        vector <long long> num;//记录输入的数字
        vector <long long> cnt;//记录最多能够砍几次
        
        int max_cnt = 0, sum = 0;//所有竹子里能砍次数的最大值 总共砍几次(答案)
        
        int main() {
            
            int a;
            scanf("%d",&a);
            
            for(int i = 0, t = 0; i < a; ++i, t = 0) {//t作为每次循环的临时变量 记录第i个竹子最多能够砍几次
                
                long long r;
                scanf("%lld",&r);
                
                num.push_back(r);
                
                while(r != 1) {//一直砍 直到r = 1
                    
                    r = sqrtl((r >> 1) + 1);//砍完后高度
                    ++t;//砍的次数+1
                }
                
                cnt.push_back(t);//记录第i个竹子最多能够砍几次
                max_cnt = max_cnt > t ? max_cnt : t;//记录所有竹子里能砍次数的最大值
            }
            
            for(int i = max_cnt; i > 0; --i) {//每次循环i都等于目前所有竹子里能砍次数的最大值 直到i = 0(所有竹子的高度都等于1)
                    
                int t = 0;//t开在外面 跳出循环还能用
                for(; t < a - 1; ++t) {//由于for循环内有num[t] != num[t + 1]语句 为防数组越界 for循环跳出条件为t >= a - 1
                    
                    if(cnt[t] != i) {//如果这个竹子并不能被砍i次 跳过这颗竹子
                        
                        continue;
                    }
                    
                    if(num[t] != num[t + 1]) {//如果相邻两颗竹子高度相同 则砍伐时不增加砍伐次数 直到相邻两颗竹子高度不同
                        
                        ++sum;
                    }
                    
                    --cnt[t];//第t棵竹子能砍伐次数-1
                    num[t] = sqrtl((num[t] >> 1)+ 1);//砍伐后高度
                }
                
                if(cnt[t] != i) {//如果最后竹子并不能被砍i次 跳过这颗竹子
                    
                    continue;
                }
                
                ++sum;//砍伐次数+1
                --cnt[t];//最后一棵竹子能砍伐次数-1
                
                num[t] = sqrtl((num[t] >> 1) + 1);//砍伐后高度
            }
            
            printf("%d",sum);//输出总次数
            
            return 0;
        }
        
    • 1