2020牛客寒假算法基础集训营第二场(补题)

#2020牛客寒假算法基础集训营第二场
(写在前面的话:本次AC了2题,5555,菜的不行了,数论方面太需要提高了)
##A 做游戏
链接:A
来源:牛客网

题目描述
牛牛和 牛可乐在玩石头剪刀布。

众所周知,石头剪刀布的规则是这样的:

  • 在一局游戏中,双方各自出石头、剪刀、布其一。
  • 胜负关系如下:

牛牛和 牛可乐进行了多轮游戏, 牛牛总共出了 A 次石头,B 次剪刀,C 次布;牛可乐总共出了 X 次石头,Y 次剪刀,Z 次布。 你需要求出 牛牛最多获胜多少局。
输入描述:
第一行,三个非负整数 A,B,C 。
第二行,三个非负整数 X,Y,Z 。
保证 A+B+C=X+Y+Z, 0\leq A,B,C,X,Y,Z\leq 10^9A+B+C=X+Y+Z,0≤A,B,C,X,Y,Z≤10
9

输出描述:
输出一行,一个整数表示答案。
示例1
输入
复制
114514 0 0
0 114514 0
输出
复制
114514
思路:水题,找出三种情况的最小值,相加即可!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll a,b,c,d,e,f;
	ll rz;
	cin>>a>>b>>c>>d>>e>>f;
	rz=min(a,e)+min(b,f)+min(c,d);
	cout<<rz;
	return 0;
} 

##B 排数字
链接:B
来源:牛客网
题目格式不正确,没能粘贴过来

思路:也算是水题,不过开始没能理解对,错了两次,刚开始理解成616 ,以每三个为一组,但是,仔细读题可以发现61616也是可以的。所以只要统计6和1的个数,如果6的个数减1与1的个数作比,少的便是答案。
先上一下我的代码!

#include<bits/stdc++.h>
using namespace std;
const int maxx=2e5+1;
int main(){
	char str[maxx];
	int s;
	int count=0;
	int lena=0,lenb=0;
	cin>>s>>str;
	for(int i=0;i<s;i++)
	{
		if(str[i]=='6') lena++;
        if(str[i]=='1') lenb++;
	}
	lena--;
	while(lena!=0&&lenb!=0){
		lenb--;
		lena--;
		count++;
	}
	cout<<count;
	return 0;
}

在上一下题解中那个,不得不说,那种思路我觉得有点类似桶排序,反正比我的高级。

#include<bits/stdc++.h>
using namespace std;
const int maxx=2e5+1;
int a[10];
int main(){
	int n;
	int ans;
	char str[maxx];
	cin>>n>>str;
	for(int i=0;i<n;i++)
		a[str[i]-'0']++;
	ans=min(a[6]-1,a[1]);
	cout<<ans;
	return 0;
} 

对,做了辣么久,我就只做出了这俩,其余的几道我就得简单的尝试了好久,
补题开始:
##D 数三角
链接:D
来源:牛客网

思路:这个题,神坑,不,是我自己坑,高中数学啊,判断是不是钝角三角形有两种方法,1,由余弦定理我们可以退出,若满足两条小边各自的平方和小于答辩的平方和,则为钝角三角形 2,向量点乘小于零。注意两种情况都要排除共线的情况。然后直接暴力跑就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll a[5001][3];
	ll m[4];
	int count=0;
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		scanf("%lld%lld",&a[i][0],&a[i][1]);
	for(int i=0;i<n-2;i++)
     	for(int j=i+1;j<n-1;j++)
	        for(int k=j+1;k<n;k++)
			{
	           	if(i!=j&&j!=k&&i!=k)
		        {
			        m[0]=(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]);
			        m[1]=(a[i][0]-a[k][0])*(a[i][0]-a[k][0])+(a[i][1]-a[k][1])*(a[i][1]-a[k][1]);
			        m[2]=(a[k][0]-a[j][0])*(a[k][0]-a[j][0])+(a[k][1]-a[j][1])*(a[k][1]-a[j][1]);
			        sort(m,m+3);
		         	if((m[0]+m[1]<m[2])&&(sqrt(m[0])+sqrt(m[1])!=sqrt(m[2])))
			            count++;
		}
	}
	cout<<count;
	return 0;
}

##G 判正误
链接:G
来源:牛客网
思路:这个题挺水,但是我么得做出来,目前来看,有两种思路:第一种,直接由pow卡数据,但是要注意一点:数据类型转换,转的过程中会遇到我们C语言初学时一个精度丢失问题,假如是1,转换成pow(确切的是浮点型)后,就变成0.9999999999;所以我们可以给他加个精度就能解决。第二种就是我上篇博客中提到的快速幂取模,真是没想到,刚提完这种思路,就能用上,虽然我没有AC.没有活学活用啊!!!
现在把第一种思路的代码贴一下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int i = 1e-8;//定义一个精度
int main(){
    int t;
    while(cin>>t)
	{
		while(t--){
	    int a,b,c,d,e,f,g;
	    cin>>a>>b>>c>>d>>e>>f>>g;
	    if(g==(ll)(pow(a,d)+i)+(ll)(pow(b,e)+i)+(ll)(pow(c,f)+i))
	    printf("Yes\n");
	    else
	    printf("No\n");
        }
    }
    return 0;
}

然后第二种思路

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
ll fastpower(ll a,ll b){
	ll ans=1;
	a=a%mod;
	while(b>0){
		if(b%2==1)
		ans=(ans*a)%mod;
		b=b/2;
		a=(a*a)%mod; 
	}
	return ans;
} 
int main(){
    int t;
    while(cin>>t)
	{
		while(t--){
	    int a,b,c,d,e,f,g;
	    cin>>a>>b>>c>>d>>e>>f>>g;
	    if(g==(ll)fastpower(a,d)+(ll)fastpower(b,e)+(ll)fastpower(c,f))
	    printf("Yes\n");
	    else
	    printf("No\n");
        }
    }
    return 0;
}

虽然这篇补题有点晚,但是我还是会努力,愿看到的人都要加油啊qwq!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值