Codeforces Round #746 (Div. 2 A/B)

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;
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/120605050