2020牛客寒假算法基础集训营5——部分题解及AC代码(F——J、无G)

F.碎碎念(dp+前缀和)

在这里插入图片描述

题目分析及AC代码:

本题采用dp的思路去解题,分析都写在代码的注释里了,话不多说,直接上代码。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int Mod=1e9+7;
int dp[maxn];
int main() 
{
    int x,q,l,r;
 	cin>>x>>q;//每次说k句   查询q次 
    dp[0]=1,dp[x]=2;//等于k的时候要么是全部AC,要么只有一次RJ,就这两种情况 
    for(int i=1;i<x;i++) 
	dp[i]=1;//小于k的时候一定是全都AC 
    for(int i=x+1;i<maxn;i++) 
	dp[i]=(dp[i-1]+dp[i-x-1])%Mod;//因为RJ的后面一定是AC 
    for(int i=1;i<maxn;i++) 
	dp[i]=(dp[i]+dp[i-1])%Mod;//用空间换取时间,操作一波前缀和,不然后面再用循环逐个累加的时候会超时 
    while(q--)
    {
        scanf("%d%d",&l,&r);
		l--;
        printf("%d\n",(dp[r]-dp[l]+Mod)%Mod);
    }
    return 0;
}

H.Hash(思维)

在这里插入图片描述

题目分析及AC代码:

作者:儒生雄才1
链接:https://ac.nowcoder.com/discuss/366644?type=101&order=0&pos=13&page=3
来源:牛客网
题解:
观察给的哈希函数可以轻松看出,这个哈希函数就仅仅是把一个只由小写字符组成的字符串当成了一个26进制的数,不取模的情况下,任意小写字符串和自然数是一一对应的。因此,只要把给的字符串转换成对应的26进制整数,加上模数后转换回字符串,一定可以得到一个最小字典序大于原串的字符串。只要这个新字符串长度为6即是满足要求的字符串。

#include <iostream>
using namespace std;
const int LEN = 6;
int mod;
char str[15];
int main()
{
    while (scanf("%s%d", str, &mod) != EOF)
    {
        long long res = 0;
        for(int i=0;i<LEN;i++)
        {
        	res=res*26+str[i]-'a';
		}
		res+=mod;
		for(int i=LEN-1;i>=0;i--)
		{
			str[i]=res%26+'a';
			res/=26;
		}
		if(res!=0)
		{
			cout<<-1<<endl;
		}
		else
		printf("%s\n",str);
    }
    return 0;
}

I.I题是个签到题(签到)

在这里插入图片描述

题目分析及AC代码:

输出Yes的就两种情况,一个是80%的人通过,另一个是通过的人数是前三多(排序),分别判断两种情况输出就行了,第一次写的时候||用成&&了,难受。注意排序后判断数组下标的判断。建立一个结构体就好。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
	int value;
	int num;
}a[20];
bool cmp(struct node a, struct node b)
{
    if(a.value < b.value)
   {
       return true;
   }
    return false;
}
int main()
{
    int n=0,m=0;
    cin>>n>>m;
    int flag=0,flag1=0;
    for(int i=1;i<=n;i++)
    {
    	 scanf("%d",&a[i].value);
    	 a[i].num=i;
	}
    if(a[9].value*1.0>=0.8*m)
    flag=1;
    sort(a+1,a+n+1,cmp);
    if(a[n].num==9||a[n-1].num==9||a[n-2].num==9)
    flag1=1;
    if(flag==1||flag1==1)
    cout<<"Yes"<<endl;
    else
    cout<<"No"<<endl;
    return 0;
}

J.牛牛战队的秀场(数学+几何)

在这里插入图片描述

题目分析及AC代码:

圆内接正n边形,可以把他们分割成n个等腰三角形,每个三角形的顶角是2π/n,腰长就是圆的半径,利用余弦定理(c ^ 2 = a ^ 2 + b^2 -2abcosC)能够计算出三角形底边的长,然后判断走过几条底边就行了。

#include<bits/stdc++.h>
#define ll long long
#define PI 3.141592653589793238462643383279
using namespace std;
int main()
{
    ll n=0,r=0;
    cin>>n>>r;
    long double c=0;
    c=(long double)sqrt(2*r*r*(1-(long double) cos((long double) (2*PI)/n)));
    ll a=0,b=0;
    cin>>a>>b;
    ll ans1=0,ans2=0,ans=0;
    if(a<b)
    {
         ans1=b-a;
         ans2=a+n-b;
         ans=min(ans1,ans2);
    }
    if(a>b)
    {
         ans1=a-b;
         ans2=b+n-a;
         ans=min(ans1,ans2);
    }
    if(a==b)
    ans=0;
    long double num=ans*c;
    cout<<setiosflags(ios::fixed)<<num<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值