牛客练习赛61

牛客练习赛61

题目链接点击就进去了

A

题意:你是一个勇士要去杀怪,自己有h滴血,然后a是自己的攻击力,H是怪物的血,A是怪物的攻击力。你每次能打n只怪物,不过这n只怪物也会打你,你得保证自己活着的前提下杀最多只怪物,问你能最多杀多少只怪物,如果能杀无数只则输出-1。

题解:暴力吧。设i是你能杀死的怪物个数。计算出你杀一个怪物需要K次,然后怪物则会打你K-1次,则你可以杀n/(k-1)*y)只怪物,当然得保证怪物数乘(k-1)y 不会等于n,因为这个时候自己也挂了。

代码:

#include<iostream>
using namespace std;
int main()
{
	int t,n,m,x,y;
	cin>>t;
	while(t--)
	{
		int ans=0;
		cin>>n>>m>>x>>y;
		if(m>=x){
			cout<<"-1"<<endl;
			continue;
		}
		int k=(x-1)/m+1;
		ans=n/((k-1)*y);
		if(ans*(k-1)*y==n)
			ans--;
		cout<<ans<<endl;
	}
	return 0;
}

还有一开始比较愚蠢的暴力代码:

#include<bits/stdc++.h>
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t,n,m,x,y;
int main()
{
	SIS;
	//¼ÓËÙcin/cout
	cin>>t;
	while(t--)
	{
		int ans=0;
		cin>>n>>m>>x>>y;
		if(m>=x){
			cout<<"-1"<<endl;
			continue;
		}
		int k=(x-1)/m+1;
		for(int i=1;i<=1000;i++)
		{
			if((k-1)*i*y<n)
				ans=i;
			else
				break;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B

题意:吃水果,每次得吃一个苹果和一个香蕉,问最少多少次可把水果吃完。规则:每次一定得同时吃一个苹果和一个香蕉。如果苹果香蕉数量不等的话。可以用魔法将其中一个变为两倍,此时次数会加一。问吃完水果最少次数。题目一定有解。

题解:
模拟,找出最小和最大,如果最大水果数比最小水果数倍数>=2 的话,则将最小水果数翻倍,如果相同,则加上操作次数,和当时的数输出即可。

#include<bits/stdc++.h>
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t,n,m;
int main()
{
	SIS;
	//¼ÓËÙcin/cout
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		int t;
		if(n<m){
			t = n;
			n = m;
			m = t;
		}
		int cnt=0;
		while(1){
			if(n==m)
			{
				cnt += n;
				cout<<cnt<<endl;
				break;
			}
			if(n/m>=2){
				m *= 2;
				cnt++;
			}else{
				n--;m--;
				cnt++;
			}
		}
	}
	return 0;
}

C

c题是个并查集的题目,补并查集中ing
并查集:

#include<iostream>
using namespace std;
int f[5050];
int find(int x)
{
	if(f[x]==x) return x;
	else return f[x]=find(f[x]);
}
void merge(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y)
		f[x]=y;
}
int main()
{
	int n,m,p,x,y;
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
		f[i]=i;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		merge(x,y);
	}
	for(int i=1;i<=p;i++)
	{
		cin>>x>>y;
		if(find(x)==find(y))
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
	return 0;
}

未完待补。。。

posted @ 2022-05-11 21:01  爱xiaoyi  阅读(36)  评论(0)    收藏  举报