11 条题解
-
31
提示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
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
青出于蓝 代码出于大神代码
#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
参考代码:
#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
AC代码
仅供参考:
#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 }
-
0
看题解里别人写的代码有点抽象,所以发一个自认为比较好理解一点的代码
#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; } }
-
-2
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
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
#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
- 上传者