3 条题解
-
3
考虑贪心。
由于在选定区间后的数都要加上一个数 ,那么很明显我们要让这个数 尽量的小,由于是绝对值,所以若要取最小,则 应当等于 。
考虑到 ,因此我们可以考虑让 。而这种情况,我们可以选择一个长度为 的区间 ,这时候区间中的最大值、最小值、平均数和中位数(平均数和中位数均为下取整)都是 ,即 ,我们只用从这个 入手即可。
由于要最小值小于等于 ,所以我们贪心选择数列中最小的数 ,每次减去 。不难发现,最终的答案为 。
两个坑点:
-
如果原数列中已经有一个小于等于 的数则直接输出 。
-
如果 ,则先看坑点 ,如果坑点 不满足则直接输出
Impossible!
。
代码:
#include<bits/stdc++.h> using namespace std; long long T; int main(){ cin>>T; while(T--){ long long n,m,k,s,minn=1e9; long long a[100009]; cin>>n>>m>>k>>s; for(int i=1;i<=n;i++){ cin>>a[i]; minn=min(minn,a[i]); } if (minn<=s) cout<<0<<endl; else if(m==0) cout<<"Impossible!"<<endl; else cout<<ceil(1.0*(minn-s)/m)<<endl; } return 0; }
-
-
1
#include<bits/stdc++.h> using namespace std; long long T; int main(){ cin>>T; while(T--){ long long n,m,k,s,minn=1e9; long long a[100009]; cin>>n>>m>>k>>s; for(int i=1;i<=n;i++){ cin>>a[i]; minn=min(minn,a[i]); } if (minn<=s) cout<<0<<endl; else if(m==0) cout<<"Impossible!"<<endl; else printf("%.0lf\n",ceil(1.0*(minn-s)/m)); } return 0; }
-
1
#include<bits/stdc++.h> using namespace std; long long T; int main(){ cin>>T; while(T--){ long long n,m,k,s,minn=1e9; long long a[100009]; cin>>n>>m>>k>>s; for(int i=1;i<=n;i++){ cin>>a[i]; minn=min(minn,a[i]); } if (minn<=s) cout<<0<<endl; else if(m==0) cout<<"Impossible!"<<endl; else cout<<ceil(1.0*(minn-s)/m)<<endl; } return 0; }
- 1
信息
- ID
- 142
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 106
- 已通过
- 25
- 上传者