A - Gamer Hemose
目录
题意:
给定一个数组n和数值h,不能连续取相同的两个数,求取和大于等于h的最小次数
题解:
第一次取最大数,第二次取第二大的,再取最大的,直到和大于等于h
用while会T掉,要自己总结一下规律
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int a[10005]={0};
long long n,h;
cin>>n>>h;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);
long long ans=h/(a[0]+a[1]); //求取次数(看是否有余数)
if(ans*(a[0]+a[1])==h) //没有余数
cout<<ans*2<<endl;
else if(ans*(a[0]+a[1])<h) //有余数
{
long long tmp=h-ans*(a[0]+a[1]); //判断是在第一个最大值达到h还是在第二个最大值
if(tmp-a[0]<=0)
cout<<ans*2+1<<endl;
else
cout<<ans*2+2<<endl;
}
}
}
B - Hemose Shopping
题意:
每行n和x,第二行n个数字,你可以交换i位置和j位置的数字,但是|i-j|>=x,问能不能排成升序数组。
题解:
当n>=2*x的时候每个数字都可以进行交换操作,由此经过若干次变换得到目的数列,当x比较大的时候,x比较大的话那势必会有一部分数列不能进行交换操作,那我们只要判断一下该部分的数列[n-x,x)是不是和目的数列相吻合即可。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a[100005];
int b[100005];
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
if(n>=2*x)
cout<<"YES"<<endl;
else
{
int flag=0;
sort(b,b+n);
for(int i=n-x;i<x;i++)
{
if(a[i]!=b[i])
{
flag=1;
break;
}
}
if(!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}