A-Gamer Hemose
题目描述
输入描述
输出描述
输入样例
3
2 4
3 7
2 6
4 2
3 11
2 1 7
输出样例
1
2
3
样例解释
签到题,轮换使用两把伤害最高的武器即可,为方便计算,可先将两把武器的伤害叠加取模。
特判余数与伤害最高的武器之间的关系即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
int main(){
int t;
cin>>t;
while(t--){
ll n,h;
ll a[N];
cin>>n>>h;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
if(a[n]>=h)
cout<<"1"<<endl;
else{
ll hert=a[n]+a[n-1];
ll ans=h/hert;
h-=ans*hert;
if(h==0)
cout<<2*ans<<endl;
if(a[n]>=h)
cout<<2*ans+1<<endl;
if(a[n]<h)
cout<<2*ans+2<<endl;
}
}
return 0;
}
B-Hemose Shopping
题目描述
输入描述
输出描述
输入样例
4
3 3
3 2 1
4 3
1 2 3 4
5 2
5 1 2 3 4
5 4
1 2 3 4 4
输出样例
NO
YES
YES
YES
样例解释
题目大意: 对于一个数组(下标从 1 开始),可以任意交换两个下标之差不小于 x 的元素,问该数组是否可以通过有限次交换形成非下降序列。
对于所有样例,易得当 x = 1 时一定可以,而对于样例 1,可以模拟出若 x = 2,能够通过交换 1 和 3 满足题意,此时的 2 虽然不可移动(原因是它最近必须与下标为 0 或 4的元素互换,而该数组的有效下标为 1 - 3 ),但由于其恰好符合非下降序列时该位的值,因此符合要求。
可取样例 n = 5,x = 2,[ 5,1,2,3,4 ] 模拟,不难发现其中的任何一个数都能通过多次变换移动到任何位置,例 2 -> 4 -> 5 -> 3 -> 1 (此处均以原序列中的数字代替其下标)。而当 x = 3 时,2 将不可进行移动,5,1,3,4 仍可移动到这四个数字中的任何位置。当 x = 4 时,1,2,3 将不可进行移动。即对于每个数组,其不可移动区间为[ n - x + 1 , x ] 。
若某数组想满足非下降序列,则需其不可移动区间内的各个数字均与该数组 sort 后对应下标的值相同。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int main(){
int t;
cin>>t;
while(t--){
int n,x,flag=1;
int a[N],b[N];
cin>>n>>x;
int y;
for(int i=1;i<=n;i++){
cin>>y;
a[i]=b[i]=y;
}
sort(b+1,b+n+1);
for(int l=n-x+1;l<=x;l++){
if(a[l]==b[l]){
continue;
}
else{
cout<<"NO"<<endl;
flag=0;
break;
}
}
if(flag==1)
cout<<"YES"<<endl;
}
return 0;
}