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;
}