牛客小白月赛21总结

牛客小白月赛21总结

PS:又是一场自闭场,前期跟榜,15分钟左右迅速切了三道题,当时排名第5名(还特意截了个图去装了个逼
在这里插入图片描述
(学校就不露了,一所双非院校,哈哈哈)
但是后面真的好难受啊,一直wa一直爽 是不可能的,搞的心态爆炸,然后看了看排名就一直在100名左右徘徊,最后一个小时就围着E、J、I。我真的感觉E不是一般的无语,开始成绩要保留整数然后四舍五入;最后的绩点又是保留两位小数四舍五入。一直wa了好多次,最后的代码觉得没问题了,但是还是wa了,无语…
最后只做出来5题,排名177,我哭辽

最后十分钟直接放弃,打了把王者,才过来补题


A:Audio


题意
还是很好懂的,就是求由三个顶点组成的三角形的外心

题解
多亏我有三角形外心的模板,于是偷了一波懒,直接copy了一下,于是在15分钟左右切了这题,也是我切的第三题

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
typedef struct Point{
    double x,y;
    Point(double xx,double yy){
        x=xx;
        y=yy;
    }
};
Point waixin(Point a,Point b,Point c){
    double a1=b.x-a.x,b1=b.y-a.y,c1=(a1*a1+b1*b1)/2;
    double a2=c.x-a.x,b2=c.y-a.y,c2=(a2*a2+b2*b2)/2;
    double d=a1*b2-a2*b1;
    return Point(a.x+(c1*b2-c2*b1)/d,a.y+(a1*c2-a2*c1)/d);
}
int main(){
    double xx,yy;
    scanf("%lf%lf",&xx,&yy);
    Point a=Point(xx,yy);
    scanf("%lf%lf",&xx,&yy);
    Point b=Point(xx,yy);
    scanf("%lf%lf",&xx,&yy);
    Point c=Point(xx,yy);
    Point d=waixin(a,b,c);
    printf("%.3f %.3f\n",d.x,d.y);
    return 0;
}


B:Bits


这种大模拟的题,真的是望虎生畏、望洋兴叹,最终没做出来


C:Channels


题意:
开始一看,还以为是一道贪心的水题,但是看了下题目后,就是每个活动都是60分钟一个周期,50分钟有内容,10分钟广告;然后给你一段时间的起点和终点,要你求他能看多少时间的内容(不包括广告)

题解:
这题还是有点小坑的,搞的心态也有点炸,主要就是开始没有考虑到广告时间不包括。起初想的是:起点可以转化为前面最近的那个起点t1,同时计算还剩下的一部分的时间x1;终点也就是类似的思路:求得后面最近的那个终点t2,同时计算多出来的那一部分时间x2。主要是没考虑到x1、x2会大于50,然后成功贡献了三发wa

后面不知道又是什么原因,就算改过来了,还是有点小问题,于是直接将题目中的从1开始转化为了从0开始,才得以AC
在这里插入图片描述

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=500000;
int main(){
    ll t1,t2;
    ll x1,x2;
    ll num;
    while(~scanf("%lld%lld",&t1,&t2)){
        t1=t1-1;
        t2-t2-1;
        x1=t1%60;
        if(x1>=50)
            x1=50;
        x2=t2%60;
        if(x2>=50){
            x2=50;
        }
        t1=t1-t1%60;
        t2=t2-t2%60;
        num=(t2-t1)/60;
        //cout<<x1<<" "<<x2<<" "<<t1<<" "<<t2<<endl;
        printf("%lld\n",num*50+x2-x1);
    }
    return 0;
}

D:DDoS


感觉并不适合我,直接跳过,哈哈哈


E:Exams


题意:
题意还是比较容易理解,主要是坑太多了。。。
每科的成绩要保留整数(四舍五入),然后学分绩点保留两位有效数字(四舍五入)
关键四舍五入我还以为电脑自动是的,原来还是要自己实现。。。

题解:
感觉后面的坑都找到了,但是最终还是一直wa,看了题解,感觉自己根本没错啊,一脸懵逼

wa的代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=100;
int n;
struct node{
    int flag;
    double credit;
    double grade1,num1,grade2,num2,grade3,num3;
};
node a[maxn];
double sum=0;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>a[i].flag>>a[i].credit>>a[i].grade1>>a[i].num1>>a[i].grade2>>a[i].num2>>a[i].grade3>>a[i].num3;
        sum+=a[i].credit;
    }
    double num=0;
    for(int i=1;i<=n;i++){
        if(a[i].flag==2)
            continue;
        int x=(int)a[i].grade1*a[i].num1+a[i].grade2*a[i].num2+a[i].grade3*a[i].num3+0.5;
        //printf("%d\n",x);
        num+=x*a[i].credit*1.0/sum*1.0;
    }
    num=(num*100+0.5)/(100*1.0);
    printf("%.2f\n",num);
    return 0;
}

F:Fool Problem


题意:
就是斐波拉契相关题。。。

题解:
开始看题就觉得是大数,于是立马打开了eclipse,乘着打开的时间继续看题,发现居然不是大数,开始尝试了一下打表,居然秒出规律,还能说啥——暴力出奇迹

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
int main(){
    string str;
    cin>>str;
    int len=str.length();
    int num=str[len-1]-'0';
    if(num%2==0){
        printf("1\n");
    }
    else{
        printf("-1\n");
    }
    return 0;
}

G:Game


题意:
给定一个正整数,两个人玩游戏,然后每个人可以将集合中的数分解成两个因数(前提是不能有1)
问:最后到谁的时候不能再分

题解:
就是一道比较简单的博弈题,但是还是没有做出来。。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
int n;
int main() {
    cin>>n;
    if(n==1) {
        printf("Nancy\n");
    }
    else {
        int ans=0;
        for(int i=2; i<=n; i++) {
            if(n%i==0){
                while(n%i==0){
                    n/=i;
                    ans++;
                }
            }
        }
        if(ans%2==0) {
            printf("Johnson\n");
        }
        else {
            printf("Nancy\n");
        }
    }
    return 0;
}


H:”Happy New Year!“


大水题,不多解释

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100000;
int main(){
    printf("\"Happy New Year!\"");
    return 0;
}

I:I love you


题意:
给你一个字符串,求序列"i love you"的个数(不区分大小写)

题解:
没做出来。。。。,虽然知道是DP,而且最近练的也是DP,但是还是没有做出来。。。
看官方题解说居然和小白赛3的一题是一样的,换汤不换药

在这里插入图片描述

这是小白月赛3的题解,于是自己动手改了改

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
string str;
int len;
int dp[10];
const int mod=20010905;
int main(){
    memset(dp,0,sizeof(dp));
    cin>>str;
    len=str.length();

    //都转化为小写
    for(int i=0;i<len;i++){
        str[i]=tolower(str[i]);
    }

    for(int i=0;i<len;i++){
        dp[1]=(dp[1]+(str[i]=='i'))%mod;
        dp[2]=(dp[2]+(str[i]=='l')*dp[1])%mod;
        dp[3]=(dp[3]+(str[i]=='o')*dp[2])%mod;
        dp[4]=(dp[4]+(str[i]=='v')*dp[3])%mod;
        dp[5]=(dp[5]+(str[i]=='e')*dp[4])%mod;
        dp[6]=(dp[6]+(str[i]=='y')*dp[5])%mod;
        dp[7]=(dp[7]+(str[i]=='o')*dp[6])%mod;
        dp[8]=(dp[8]+(str[i]=='u')*dp[7])%mod;
    }

    printf("%d\n",dp[8]);
    return 0;
}

不得不说DP真的太活了。。。还是做的题不够,这道题按道理应该要做出来的


J:Jelly


题意:
就是三维迷宫求最短路径

题解:
直接就是裸的bfs,但是还是贡献了一发wa,由于比较着急,导致没有考虑到不存在输出-1的情况,这个太不应该了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=100;
char mp[maxn+10][maxn+10][maxn+10];
int vis[maxn+10][maxn+10][maxn+10];
int n;
int dirx[7]={0,0,0,-1,1,0,0};
int diry[7]={0,0,0,0,0,1,-1};
int dirz[7]={0,1,-1,0,0,0,0};
int flag=0;
struct node{
    int x,y,z;
    int s;
    node(int xx,int yy,int zz,int ss){
        x=xx;
        y=yy;
        z=zz;
        s=ss;
    }
};
queue<node>q;
int check(int x,int y,int z){
    if(x<1||x>n||y<1||y>n||z<1||z>n)
        return 0;
    else if(mp[x][y][z]=='*'||vis[x][y][z]==1)
        return 0;
    else
        return 1;
}
void bfs(int x,int y,int z){
    q.push(node(x,y,z,1));
    vis[x][y][z]=1;
    while(!q.empty()){
        node now=q.front();
        if(now.x==n&&now.y==n&&now.z==n){
            cout<<now.s<<endl;
            flag=1;
            return ;
        }
        q.pop();
        for(int i=1;i<=6;i++){
            int fx=now.x+dirx[i];
            int fy=now.y+diry[i];
            int fz=now.z+dirz[i];
            if(check(fx,fy,fz)){
                q.push(node(fx,fy,fz,now.s+1));
                vis[fx][fy][fz]=1;
            }
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%s",mp[i][j]+1);
        }
    }
    memset(vis,0,sizeof(vis));
    bfs(1,1,1);
    if(flag==0){
        printf("-1\n");
    }
    return 0;
}

感觉八道题其实应该没问题的,这次还是比以前几次要稍微好一点了,至少不是全程崩溃
还有那么点波澜。。。

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

猜你喜欢

转载自blog.csdn.net/boliu147258/article/details/104034556