11 条题解

  • 31
    @ 2023-2-28 15:55:34
    提示1
            为了让调整次数尽量少,应采取“不得不调整时才调整”的策略。

    提示2
            考虑温度的范围而不是具体的温度值,也就是对于当前气温,可能的空调温度范围。

    提示3
            随着气温变化,可能的空调温度范围会不断缩小。

    完整思路
            对于当前气温$a_i$,可能的温度最小是$a_i-x$,最大是$a_i+x$。

            维护变量lf和rt,分别表示当前可能被设置的温度的最小值和最大值。

            当气温变化到$a_{i+1}$,用$a_{i+1}-x$来更新lf,用$a_{i+1}+x$来更新rt。

            如果更新后的lf比rt还大,说明此时无解,调整温度的次数增加1,并把lf更新为$a_{i+1}-x$,rt更新为$a_{i+1}+x$。

            最后输出调整次数即可。


    核心代码
    
    int ans = 0, lf = 1, rt = 1e9;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (a[i] + x >= lf && a[i] - x <= rt) {
            lf = max(lf, a[i] - x);
            rt = min(rt, a[i] + x);
        } else {
            ans++;
            lf = max(a[i] - x, 0);
            rt = min(a[i] + x, (int)1e9);
        }
    }
    cout << ans << '\n';
    



    • 15
      @ 2023-8-12 11:24:42

      P1026

      -题目回顾-

      禾木通过天气预报,得到了接下来n个小时每小时的气温。(温度用正整数表示)

      禾木最初可以给空调设置一个任意温度,然后每小时可以调整一次空调温度(也可以不调整),他希望空调设置的温度,和气温相差的绝对值,永远不超过x。

      请你计算他最少需要调整多少次温度。


      -分析-

      为了让调整次数尽量少,应采取“不得不调整时才调整”的策略,即差值一超过x就调整


      -代码-

      #include <bits/stdc++.h>//by AGOMG(hetao1193656)
      using namespace std;
      int g, n, t, a;
      int main(){
          cin >> g;
          for(int i = 1; i <= g; i++){
              cin >> n >> t;
              int ans = 0, lf = 1, rt = 1e9;
              for (int j = 1; j <= n; j++) {
                  cin >> a;
                  if (a + t >= lf && a - t <= rt) {
                      lf = max(lf, a - t);
                      rt = min(rt, a + t);
                  } else {
                      ans++;
                      lf = max(a - t, 0);
                      rt = min(a + t, (int)1e9);
                  }
              }
              cout << ans << endl;
          }
          return 0;
      }
      
      • 11
        @ 2023-8-31 21:49:27

        青出于蓝 代码出于大神代码

        #include<bits/stdc++.h>
        using namespace std;
        int t,n,x;
        const int b=1e9;
        int inn,l,r,sum;//L,R:要求范围左右端点
        int main()
        {
            cin>>t;
            for(int i=1;i<=t;i++)
            {
                cin>>n>>x;
                l=-b;
                r=b;
                sum=0;
                for(int i=1;i<=n;i++)
                {
                    cin>>inn;
                    if((inn+x<l)||(inn-x>r))//所需范围不在要求范围中
                    {
                        l=inn-x;
                        r=inn+x;
                        sum++;
                    }
                    else
                    {
                        
                        if(inn-x>l)l=inn-x;
                        if(inn+x<r)r=inn+x;
                    }
                }
                cout<<sum<<endl;
            }
            return 0;
        }
        
        • 8
          @ 2024-3-2 17:07:58

          参考代码:

          #include<bits/stdc++.h>
          using namespace std;
          int t,n,x;
          const int b=1e9;
          int inn,l,r,sum;//L,R:左右端点
          int main()
          {
              cin >> t;
              for(int i = 1;i <= t;i++)
              {
                  cin >> n >> x;
                  l = -b;
                  r = b;
                  sum=0;
                  for(int i=1;i<=n;i++)
                  {
                      cin>>inn;
                      if((inn+x<l)||(inn-x>r))//所需范围在不在要求范围中
                      {
                          l=inn-x;
                          r=inn+x;
                          sum++;
                      }
                      else
                      {                
                          if(inn-x>l)l=inn-x;
                          if(inn+x<r)r=inn+x;
                      }
                  }
                  cout<<sum<<endl;
              }
              return 0;
          }
          【挑战题】空调
          题目描述
          禾木通过天气预报,得到了接下来n个小时每小时的气温。(温度用正整数表示)
          
          禾木最初可以给空调设置一个任意温度,然后每小时可以调整一次空调温度(也可以不调整),他希望空调设置的温度,和气温相差的绝对值,永远不超过x。
          
          请你计算他最少需要调整多少次温度。
          
          输入格式
          第一行一个正整数t,表示数据组数。
          
          对于每组数据,第一行两个正整数n和x,第二行n个正整数,表示每小时的温度。
          
          输出格式
          一个整数,表示需要调整温度的次数。(最初的设置温度不算做调整)
          

          核心代码:

          for(int i = 1;i <= t;i++)
              {
                  cin >> n >> x;
                  l = -b;
                  r = b;
                  sum=0;
                  for(int i=1;i<=n;i++)
                  {
                      cin>>inn;
                      if((inn+x<l)||(inn-x>r))//所需范围在不在要求范围中
                      {
                          l=inn-x;
                          r=inn+x;
                          sum++;
                      }
                      else
                      {                
                          if(inn-x>l)l=inn-x;
                          if(inn+x<r)r=inn+x;
                      }
                  }
                  cout<<sum<<endl;
          

          请勿吞噬 看着打一遍也行

          • 5
            @ 2023-8-10 15:21:27

            AC代码 image


            仅供参考:

            #include <bits/stdc++.h>
            using namespace std;
            int a;//hetao2043796
            int main(){
                int t;//hetao2043796
                cin >> t;//hetao2043796
                for (int k = 0; k < t; k++)//hetao2043796
                {
                   int n,x; //hetao2043796
                   cin >>n >>x;//hetao2043796
                   int ans = 0,lf = 1,rt = 1e9;//hetao2043796
                   for(int i = 1; i <= n; i++) //hetao2043796
                   {
                        cin >> a;//hetao2043796
                        if (a +x >= lf && a - x <= rt)//hetao2043796
                        {
                            lf = max(lf,a - x);//hetao2043796
                            rt = min(rt,a + x);//hetao2043796
                        }
                        else 
                        {
                            ans++;//hetao2043796
                            lf = max(a - x,0);//hetao2043796
                            rt = min(a + x, (int)1e9);//hetao2043796
                        }
                   }
                   cout << ans << '\n';//hetao2043796
                }
                return 0;//hetao2043796
            }
            
            • 1
              @ 2024-5-17 18:17:48

              核心代码:

              long long minn=10000000005,maxn=0,ans=0;
                      for (long long i=0;i<m;i++)
                      {
                          maxn=max(maxn,tem[i]);
                          minn=min(minn,tem[i]);
                          if (maxn-minn>x*2)
                          {
                              ans++;
                              minn=tem[i];
                              maxn=tem[i];
                          }
                      }
              

              话说禾木家住广岛吗??? 最高温度这么高???

              • 0
                @ 2023-11-23 22:28:46

                看题解里别人写的代码有点抽象,所以发一个自认为比较好理解一点的代码

                #include <iostream>
                #include <algorithm>
                using std::cout; using std::cin; using std::endl;
                using std::min; using std::max;
                
                int main() {
                    int t;
                    cin >> t;
                    while (t--) {
                        int n, x;
                        cin >> n >> x;
                        int cnt = 0;
                        int left = 0, right = 1e9;
                        while (n--) {
                            int temp;
                            cin >> temp;
                            left = max(left, temp - x);
                            right = min(right, temp + x);
                            if (left > right) {  // 可能设置的最小值小于最大值了,须调整
                                ++cnt;
                                left = temp - x;
                                right = temp + x;
                            }
                        }
                        cout << cnt << endl;
                    }
                }
                
                • 0
                  @ 2023-4-28 20:15:33

                  有没有同学解答一下,这道题的数据范围咋整啊

                • -2
                  @ 2023-11-7 12:52:49

                  P1026

                  禾木通过天气预报,得到了接下来n个小时每小时的气温。(温度用正整数表示)

                  禾木最初可以给空调设置一个任意温度,然后每小时可以调整一次空调温度(也可以不调整),他希望空调设置的温度,和气温相差的绝对值,永远不超过x。

                  请你计算他最少需要调整多少次温度。


                  -分析-

                  为了让调整次数尽量少,应采取“不得不调整时才调整”的策略,即差值一超过x就调整


                  -代码-

                  #include<bits/stdc++.h>   //by hetao5487227
                  using namespace std;
                  int t,n,x;
                  const int b=1e9;
                  int inn,l,r,sum;   //L,R:要求范围左右端点
                  int main()
                  {
                      cin>>t;
                      for(int i=1;i<=t;i++)
                      {
                          cin>>n>>x;
                          l=-b;
                          r=b;
                          sum=0;
                          for(int i=1;i<=n;i++)
                          {
                              cin>>inn;
                              if((inn+x<l)||(inn-x>r))   //所需范围不在要求范围中
                              {
                                  l=inn-x;
                                  r=inn+x;
                                  sum++;
                              }
                              else
                              {
                                  
                                  if(inn-x>l)l=inn-x;
                                  if(inn+x<r)r=inn+x;
                              }
                          }
                          cout<<sum<<endl;
                      }
                      return 0;
                  }
                  
                  • -3
                    @ 2023-11-7 12:51:03

                    P1026

                    禾木通过天气预报,得到了接下来n个小时每小时的气温。(温度用正整数表示)

                    禾木最初可以给空调设置一个任意温度,然后每小时可以调整一次空调温度(也可以不调整),他希望空调设置的温度,和气温相差的绝对值,永远不超过x。

                    请你计算他最少需要调整多少次温度。


                    -分析-

                    为了让调整次数尽量少,应采取“不得不调整时才调整”的策略,即差值一超过x就调整


                    -代码-

                    #include<bits/stdc++.h>   //hetao5487227
                    using namespace std;
                    int t,n,x;
                    const int b=1e9;
                    int inn,l,r,sum;   //L,R:要求范围左右端点
                    int main()
                    {
                        cin>>t;
                        for(int i=1;i<=t;i++)
                        {
                            cin>>n>>x;
                            l=-b;
                            r=b;
                            sum=0;
                            for(int i=1;i<=n;i++)
                            {
                                cin>>inn;
                                if((inn+x<l)||(inn-x>r))   //所需范围不在要求范围中
                                {
                                    l=inn-x;
                                    r=inn+x;
                                    sum++;
                                }
                                else
                                {
                                    
                                    if(inn-x>l)l=inn-x;
                                    if(inn+x<r)r=inn+x;
                                }
                            }
                            cout<<sum<<endl;
                        }
                        return 0;
                    }
                    
                    • -12
                      @ 2023-11-7 12:53:21
                      #include <bits/stdc++.h>//by AGOMG(hetao1193656)
                      using namespace std;
                      int g, n, t, a;
                      int main(){
                          cin >> g;
                          for(int i = 1; i <= g; i++){
                              cin >> n >> t;
                              int ans = 0, lf = 1, rt = 1e9;
                              for (int j = 1; j <= n; j++) {
                                  cin >> a;
                                  if (a + t >= lf && a - t <= rt) {
                                      lf = max(lf, a - t);
                                      rt = min(rt, a + t);
                                  } else {
                                      ans++;
                                      lf = max(a - t, 0);
                                      rt = min(a + t, (int)1e9);
                                  }
                              }
                              cout << ans << endl;
                          }
                          return 0;
                      }
                      
                      • 1

                      信息

                      ID
                      20
                      时间
                      1000ms
                      内存
                      256MiB
                      难度
                      4
                      标签
                      递交数
                      1732
                      已通过
                      796
                      上传者