牛客周赛 Round 76题解

小红出题

 思路:我们发现,每七天可以获得15元,那么我们可以对7取模,看能有多少7的倍数,然后剩下的就是看是否超过5,超过5就直接+15,否则加上天数*3

#include<bits/stdc++.h>
using namespace std;
int n;
signed main()
{
	cin>>n;
	int a=n/7;
	int ans=a*15;
	int b=n%7;
	if(b>5)
	{
		ans+=15;
	}
	else
	{
		ans+=b*3;
	}
	cout<<ans;
	return 0;
} 

串串香

思路:直接输出出现频率最高的字符即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
string s;
int c[30];
signed main()
{
	cin>>n;
	cin>>s;
	for(int i=0;i<n;i++)
	{
		c[s[i]-'a'+1]=0;
	}
	int flag=0;
	int maxn=0;
	for(int i=1;i<=26;i++)
	{
	    if(c[i]>maxn)
		{
			maxn=c[i];
			flag=i;
			}	
	}
	cout<<(char)('a'+flag);
	return 0;
}

 小红的gcd

思路:一路gcd下来,然后乘以个数就行

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[200005];
int st[200005][20];
int gcd(int a,int b)
{
	if(b==0)
	return a;
	else
	return gcd(b,a%b);
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int d=a[1];
	for(int i=2;i<=n;i++)
	{
		d=gcd(a[i],d);
	}
	cout<<d*n;
	return 0;
}

奇偶调整

思路:用优先队列存储,然后不断对最大的操作

#include<bits/stdc++.h>
using namespace std;
#define int long long

int n, m, k;

signed main() {
    cin >> n >> m >> k;
    m=min(m,3200000LL);
    k=min(k,3200000LL); 
    priority_queue<int> pq;
    vector<int> a(n);
    
    for (int i = 0; i < n; i++) 
    {
        cin >> a[i];
        pq.push(a[i]);
    }

    int result = 0;
    
    while ((m > 0 || k > 0)&&!pq.empty()) 
    {
        int top = pq.top();
        pq.pop();
        if (top % 2 == 0 && m > 0) 
        {
            pq.push(top / 2);
            m--;
        } 
        else if (top % 2 == 1 && k > 0) 
        {
            
            pq.push(top - 1);
            k--;
        } 
        else 
        {
            result += top;
        }
    }
    while (!pq.empty()) 
    {
        result += pq.top();
        pq.pop();
    }
    cout << result << endl;
    return 0;
}

 幂次进近

思路:标准的三分问题+快速幂优化

二分解决单调性,三分解决单峰函数或者单谷函数

#include<bits/stdc++.h>
using namespace std;
#define int long long
const long long INF = 4e18; 
int fast(int a, int b)   
{  
    int result = 1;  
    int base = a;  
    while (b > 0)   
    {  
        if (b % 2 == 1)   
        {  
            result = (result * base);  
        }  
        base = (base * base) ;  
        b /= 2;  
    }  
    return result;  
}  
void solve()
{
	int n,k;
	cin>>n>>k;
	if(k==1)
	{
		cout<<n<<"\n";
		return ;
	}
	int l=1,r=(int)(pow(INF,1.0/k));
	while(r-l>2)
	{
		int midl=l+(r-l)/3;
		int midr=r-(r-l)/3;
		int ansl=abs(n-fast(midl,k));
		int ansr=abs(n-fast(midr,k));
		if(ansl<ansr)
		{
			r=midr;
		}
		else
		{
			l=midl;
		}
	}
	int ans=INF;
	int flag=max(1LL,l-2);
	for(int i=flag;i<=r;i++)
	{
		if(abs(n-fast(i,k))<ans)
		{
			ans=abs(n-fast(i,k));
			flag=i;
		}
	} 
    cout << flag << "\n";  
	return ;
}

signed main()
{
	ios_base::sync_with_stdio(false);  
    cin.tie(nullptr); cout.tie(nullptr);
	int t;
	cin>>t;
	while(t--)
	solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值