2020牛客寒假算法基础集训营5 题目及解析

传送门:2020牛客寒假算法基础集训营5
传送门:2020牛客寒假算法基础集训营4 题目及解析

由于是个人总结向,所以有点精简,而且可能和官方的标程截然不同,当然如果有什么疑问可以留言或者私信交流。

A. 模板

思路:

  1. 签到题吧,名字起的吓人,楞是先交了一发I再做。
  2. 答案取不同字符数+长度差。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=5e3+5;


int main()
{
	ll n=read(),m=read();
	string s1,s2;
	cin>>s1>>s2;
	ll k=min(n,m);
	ll ans=0;
	for(int i=0;i<k;i++)
        if(s1[i]!=s2[i])
            ans++;
    cout<<ans+abs(n-m)<<endl;
	return 0;
}


B. 牛牛战队的比赛地

思路:

  1. 三分模板题,可以发现最大距离的最小值随x的变化会出现一个极值,所以直接枚举x。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=1e5+5;

struct node{
    ll x,y;
    friend bool operator <(node a ,node b){return a.x<b.x;}
}a[manx];
ll n;
double check(double x){
    double mi=-0x7fffffff;
    for(int i=1;i<=n;i++){
        mi=max(mi,sqrt((a[i].x-x)*(a[i].x-x)+a[i].y*a[i].y));
    }
    return mi;
}

int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        a[i].x=read(),a[i].y=read();
    double l=-10000.0,r=10000.0;
    while(l+(1e-11)<r){
        double mid1=l+(r-l)/3;
        double mid2=r-(r-l)/3;
       // cout<<mid1<<" "<<mid2<<endl;
        if(check(mid1)<=check(mid2)) r=mid2;
        else l=mid1;
    }
    printf("%.6lf",check(l));
	return 0;
}


C. C语言IDE

思路:

  1. 毒瘤题,等有空补。

代码如下:




D. 牛牛与牛妹的约会

思路:

  1. 阿,这题得反省,看到人多也没去写,写F写太久了。
  2. 直接根据题意模拟贪心即可。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=1e5+5;


int main()
{
    ll n=read();
    while(n--){
        double a,b,c=1.0/3.0,ans=0.0;
        scanf("%lf%lf",&a,&b);
        while(1){
            double x,y;
            if(a<0) x=-pow(-a,c);
            else x=pow(a,c);
            if(abs(x-b)+1<abs(a-b)) a=x,ans+=1.0;
            else{
                ans+=abs(a-b);
                break;
            }
        }
        printf("%.7lf\n",ans);
    }
	return 0;
}


E. Enjoy the game

思路:

  1. 第一次 奇数必胜 偶数必输 wa 。
  2. 第二次 加个特判 2和2的偶数倍必输 其他必胜 wa 。
  3. 第三次 想了一下,是2的幂数必输 其他必胜 ac 。
  4. 指先手。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=5e3+5;

int main()
{
	ll n=read();
    while(n%2==0){
        n/=2;
    }
	if(n>1) puts("Bob");
	else puts("Alice");
	return 0;
}


F. 碎碎念

思路:

扫描二维码关注公众号,回复: 9132865 查看本文章
  1. dp[i][0] 是第i次提交 rj,dp[i][1] 是第i次ac 。
  2. 注意rj之后必定ac,因为这个调了很久。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=100000+5;
ll dp[manx][2], f[manx];

int main()
{
    ll k,q,l,r;
    scanf("%lld%lld",&k,&q);
    memset(dp,0,sizeof(dp));
    memset(f,0,sizeof(f));
    dp[0][1]=1;
    for(int i=1;i<manx;i++){
        if(i>=k) dp[i][0]=dp[i-k][1];
        dp[i][1]=(dp[i-1][1]+dp[i-1][0])%mod;
        f[i]=(f[i-1]+dp[i][1]+dp[i][0])%mod;
    }
    while(q--){
        scanf("%lld%lld",&l,&r);
        printf("%lld\n",((f[r]-f[l-1])%mod+mod)%mod);
    }
	return 0;
}


H. Hash

思路:

  1. 取hash值 记得把函数里面的mod去掉 再加一个mod 就是最小的s 。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
//#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=1e5+5;

const int LEN = 6;
char s[LEN],ans[LEN];
int mod;
int Hash(char str[])
{
    int res = 0;
    for (int i = 0; i < LEN; i++)
    {
        res = (res * 26 + str[i] - 'a') ; 
    }
    return res;
}
char c[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'
                     ,'p','q','r','s','t','u','v','w','x','y','z'};
int main()
{
    while(scanf("%s%d",s,&mod)!=EOF){
        ll res=Hash(s);
        res+=mod;
        for(int i=LEN-1;i>=0;i--)
            ans[i]=c[res%26],res/=26;
        if(res) put3();
        else printf("%s\n",ans);
    }
    return 0;
}



I. I题是个签到题

思路:

  1. 水题,计算过题人数比I题多的是否超过2道即可/或者算百分比。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;
 
const int manx=5e3+5;
struct node{
    ll pos,w;
    friend bool operator <(node a, node b){ return a.w>b.w;}
}a[manx];

map<ll,ll>mp;
int main()
{
    ll n=read(),m=read(),ans=0;
    for(int i=1;i<=n;i++)
        a[i].w=read(),a[i].pos=i;
    for(int i=1;i<=n;i++){
        if(i!=9&&a[i].w>a[9].w)
            ans++;
    }
    if(a[9].w*5>=m*4 || ans<=2 ) put1();
    else put2();
    return 0;
}


J. 牛牛战队的秀场

思路:

  1. 注意 i 可能比 j 小,其他一切好说。

    代码如下:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll long long
//#define ll unsigned long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
#define pi acos(-1)
#define mea (memset(a,0,sizeof(a)))
#define myit set<ll>::iterator
#define mysets multiset<ll>
#define myits multiset<ll>::iterator
#define v30 (1<<30)-1
#define all(x) (x).begin(),(x).end()
#define maxs *s.rbegin()
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mid ((a[k].r+a[k].l)>>1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define kl k<<1
#define kr k<<1|1
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
using namespace std;

const int manx=5e3+5;


int main()
{
    // R=A/(2sin(180/n))
    ll n=read(),r=read();
    ll i=read(),j=read();
    double d= 2*r*1.0 * sin(pi/(n*1.0));
    if(i>j) swap(i,j);
    double mi=min(j-i,n-j+i);
    d*=(mi*1.0);
    printf("%.6lf\n",d);
	return 0;
}


发布了62 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/104301257
今日推荐