牛客练习赛79

牛客练习赛79

  • A 炼金术师
    题目简述:
    两个人分别对一个数组进行填数 第一个人第i次填的颜色为i区间为[0,ai]。进行n次填充,而第二个人对另一个数组进行填色,他可以选择[1,n][1,n]中的任意一种颜色,以及任意的一个右端点rr,将该画布的[0,r][0,r]区间染成此次选择的颜色。求第二个人最少最少次可以将数组变成第一个人一样。
    题目分析:
    因为第一个人(此后成为甲)染色有后面的覆盖前面的颜色,所以我们可以用一个栈来模拟这道题目,如果栈顶的数小于将要入栈的数,那么意味着后面的数会覆盖前面染过的区间,所以讲栈顶的数取出,直到栈顶的数大于入栈的数后,再入栈。分析第二个人(此后称为乙)分析乙可知,如果乙需要用最少的次数来变成甲一样的话,其实就是算甲n轮后数组中有多少种颜色。所以最后的输出为n轮后栈的元素个数。
#include<bits/stdc++.h>
using namespace std;

int main(){
    stack<int>s;
    int n;cin>>n;
    for(int i=0;i<n;i++){
        int a;
        scanf("%d",&a);
        while(!s.empty() && s.top()<=a)s.pop();
        s.push(a);
    }
    cout<<s.size()<<endl;
}
  • B 刀工对决
    题目复述:
    为了争夺传说中的厨具永灵刀,特级厨师小当家和七星刀雷恩展开了神前刀工对决。对决总共有n轮刀工测试,每轮给出两块绸鱼肉,一块长度为a,另一块长度为b,厨师必须把这两份绸鱼肉切成一样长。
    已知小当家总共有两把菜刀,每把作用如下:
    钢丝菜刀:若当前绸鱼肉长度x为3的倍数,可以切掉三分之二的绸鱼肉,切掉的部分必须扔掉,即x变为x/3。
    百穴菜刀:若当前绸鱼肉长度x为5的倍数,可以切掉五分之二的绸鱼肉,切掉的部分必须扔掉,即x变为3*x/5。
    小当家每使用菜刀切一刀绸鱼肉就要花费1秒,请问小当家完成n轮测试的最短时间是多少。
    题目分析:
    分析其变化规律可知,每个肉的长度其为3或5的倍数,其由3的n次方×5的n次方组成,所以可以将a化简成有多少个3和多少个5.同理b也一样,如果化简到最后a与b不相等则输出-1。而一个5可以转化成一个3,同时5减一。最后需要多少次即为a,b两个数3的个数相减并加上a,b两个数5的个数的差值。
#include<bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin>>n;
    int ans=0;
    while(n--){
        int a,b;
        cin>>a>>b;
        int xa=0,ya=0,xb=0,yb=0;
        while(a%3==0) {xa++;a/=3;}
        while(a%5==0) {ya++;a/=5;}
        while(b%3==0) {xb++;b/=3;}
        while(b%5==0) {yb++;b/=5;}
        if(a!=b){
            cout<<-1<<endl;
            return 0;
        }
        if(ya>yb){
            ans+=ya-yb;
            xa+=ya-yb;
        }
        else {
            ans+=yb-ya;
            xb+=yb-ya;
        }
        ans+=abs(xa-xb);
    }
    cout<<ans<<endl;
}
  • C 小G的GCD
    题目简述:
    小G刚学习完辗转相除法求GCD,现在他想探究一下辗转相除具体的次数。然后写出了如下代码:
long long GCD(long long x, long long y) {
     if (!y) return 1ll;
     return GCD(y, x % y) + 1ll;
}

现在小G很好奇一个问题,他想求一下maxGCD小G接着写出了以下代码:

long long maxGCD(long long n) {
     long long ans = 0ll;
     for (long long i = 1; i <= n; i++)
         for (long long j = 1; j <= n; j++)
             ans = max(ans, GCD(i, j));
     return ans;
 }

但是这个代码太慢了,小G会给出一个{n}n,希望你帮他快速求出答案。

#include<bits/stdc++.h>
using namespace std;
long long a[300005]={1,1};
int main(){
	int t=1;
	long long n;
	for(int i=2;i<300000;i++){
		a[i]=a[i-1]+a[i-2];
	}
	cin>>n;
	while(a[t]<=n){
		t++;
	}
	cout<<t;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值