牛客练习赛61

牛客练习赛61

题目链接点击就进去了

A

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

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

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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 的话,则将最小水果数翻倍,如果相同,则加上操作次数,和当时的数输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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
并查集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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;
}

未完待补。。。

-------------本文结束感谢您这么好看还看我的文章-------------