5/13 华为校招 软件 笔试 590/600

第一题写了个很脑瘫的bug,怎么改都是90.91%
交了卷才发现是几个名字很像的变量 写着写着就搞混了

***以后再也不乱起名了***

第一题 星期几(90.91/100)常识?
给定两个日期,告诉你前一个是周几,让你判断后一个是周几

数据只有一行 数字之间用空格隔开 我用的gets()读入
思想是先算前一个日期到当年1月1日的差,再算后一个日期到当年1月1日的差
然后随便加加减减就出来了
判断闰年的函数反反复复交了好几次,才试出来。。
(贴出来的是更正过的代码)
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
char ch[100];
int t[10];
int tian[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool run(int year){
    if((year%4==0&&year%100!=0)||(year%400==0))
        return true;
    return false;
}

int main(){
    gets(ch);
    int l=strlen(ch);
    int num=0,tmp=0;
    for(int i=0;i<l;++i){
        if(ch[i]==' '||ch[i]=='|'){
            t[++num]=tmp;
            tmp=0;
            continue;
        }
        tmp=tmp*10+ch[i]-'0';
    }
    t[++num]=tmp;
    int year1=t[1],month1=t[2],day1=t[3];
    int year2=t[5],month2=t[6],day2=t[7];
    //cout<<year2-year1<<" "<<month2-month1<<" "<<day2-day1;
    int num1=day1,num2=day2;
    
    for(int i=1;i<month1;++i){
        if(i==2&&run(year1)) num1++;
        num1+=tian[i];
    }
    for(int i=1;i<month2;++i){
        if(i==2&&run(year2)) num2++;
        num2+=tian[i];
    }
    
    int ans=t[4]+num2-num1;
    for(int i=year1;i<year2;++i){
        if(run(i)) ans++;
        ans+=365;
    }
    ans%=7;
    if(ans==0) ans+=7;
    cout<<ans;
}


第二题 路灯亮度调节(200/200)模拟+排序
一维直线,给出路灯和车站的坐标,问路灯亮度最小为多少时可以照亮所有车站

字符串读入之后,处理一下,存一个deng数组,一个zhan数组,然后排序
C++的话直接sort()一下
for循环,从0开始枚举亮度(有可能站和灯的坐标重了),逐个看每个站能否被照亮
有一个不能的话,直接continue,判断下一个亮度可不可以
如果所有的站都能,输出当前的亮度,break
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char stop[100001];
int zhan[10001];
char lamp[100001];
int deng[10001];

int main(){
    scanf("%s",stop);
    scanf("%s",lamp);
    
    int num1=0,tmp=0;
    int l1=strlen(stop);
    for(int i=0;i<l1;++i){
        if(stop[i]==','){
            zhan[++num1]=tmp;
            tmp=0;
            continue;
        }
        tmp=tmp*10+stop[i]-'0';
    }
    zhan[++num1]=tmp;
    
    int num2=0;tmp=0;
    int l2=strlen(lamp);
    for(int i=0;i<l2;++i){
        if(lamp[i]==','){
            deng[++num2]=tmp;
            tmp=0;
            continue;
        }
        tmp=tmp*10+lamp[i]-'0';
    }
    deng[++num2]=tmp;
    
    sort(zhan+1,zhan+num1+1);
    sort(deng+1,deng+num2+1);
    
    for(int i=0;i<=999;++i){ // meiju liangdu
        int nowzhan=1,nowdeng=1;
        while(nowzhan<=num1&&nowdeng<=num2){
            if(zhan[nowzhan]-deng[nowdeng]<=i
			&&deng[nowdeng]-zhan[nowzhan]<=i) //neng
                nowzhan++;
            else if(deng[nowdeng]>zhan[nowzhan]) break;
            else nowdeng++;
        }
        if(nowzhan>num1){
            cout<<i<<endl;
            break;
        }
    }
}

第三题 租书屋(300/300) 搜索
有n本书,m个顾客每人想租其中任意本书,问书店进货至少进几本可以满足所有人

gets大法好,我要是不会用gets,今天晚上三道题一道都做不出来
看数据规模知解法,n<=100,m<=20,肯定是要搜的
一开始懒得搜,看样例输入输出,发现结果恰好=n-m
于是在读入之后什么都不做,直接输出n-m,过了20%。。。

应该可以贪心(评论区里有说) ,但是个人感觉dfs可能更好想一点
存两个二维数组,分别记录每个顾客想要什么书,每本书被什么顾客要
然后dfs随便打打就ac了,以下是第三题的代码

(woc,我贴出代码之后才发现,自己dfs写的是什么鬼==
为什么“满足”数组只赋值为1,没回溯回0啊。。。我到底怎么ac的啊)
这次真的是瞎猫碰见死耗子,最后的答案正好就是第一遍搜出来的结果
太神奇了🤪
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
int book[101][22];
int guke[22][101];
char ch[1001];
int n,m,l,tmp,ans=100;
int num,maxx,minx=100;
bool manzu[22];
bool buyed[101];

void dfs(int buy){
    if(buy>=ans) return;
    for(int i=1;i<=m;++i) manzu[i]=0;
    for(int i=minx;i<=maxx;++i){
        if(buyed[i]){ //maile
            for(int j=1;j<=book[i][0];++j){
                manzu[book[i][j]]=1;
            }
        }
    }
    int todo=0;
    for(int i=1;i<=m;++i)
        if(!manzu[i]){
            todo=i;
            break;
        }
    if(!todo){
        if(buy<ans)
            ans=buy;
        return;
    }
    
    for(int i=minx;i<=maxx;++i){
        if(!buyed[i]&&book[i][0]){ //can buy but did not buy
            buyed[i]=1;
            dfs(buy+1);
            buyed[i]=0;
        }
    }
}

int main(){
    cin>>n>>m;
    gets(ch);
    while(gets(ch)){
        l=strlen(ch);
        num++;
        tmp=0;
        
        for(int i=0;i<l;++i){
            if(ch[i]==' '){
                guke[num][++guke[num][0]]=tmp;
                book[tmp][++book[tmp][0]]=num;
                tmp=0;
                continue;
            }
            tmp=tmp*10+ch[i]-'0';
        }
        guke[num][++guke[num][0]]=tmp;
        book[tmp][++book[tmp][0]]=num;
    }
    for(int i=1;i<=m;++i)
        for(int j=1;j<=guke[i][0];++j){
            if(guke[i][j]<minx) minx=guke[i][j];
            if(guke[i][j]>maxx) maxx=guke[i][j];
        }
    dfs(0);
    cout<<ans;
}


祝各位牛油生活愉快,早日收获心仪的offer
#华为笔试##华为##笔试题目#
全部评论
路灯那个题可不可以直接判断距离每个车站最近的路灯的距离,然后取这些距离的最大值啊,大佬
1 回复 分享
发布于 2020-05-14 11:35
第三题直接用python写了,华为的笔试这几题输入对c++太不友好了😂
点赞 回复 分享
发布于 2020-05-13 22:03
第三题dfs吗……我看了n小于等于100,怕超时就换了贪心,结果贪心不太对……最后贪心只对了90%后来和同学一起想了想觉得贪心好像确实不对😂
点赞 回复 分享
发布于 2020-05-13 22:34
第二题题目没看懂&nbsp;就这样吧
点赞 回复 分享
发布于 2020-05-13 22:37
是校招实习吗?
点赞 回复 分享
发布于 2020-05-14 09:57
博主你好  请问为什么'num&(3976)#39;这个变量从100开始累加啊?
点赞 回复 分享
发布于 2020-06-06 10:38
楼主请问您投的是软件开发岗位吗?
点赞 回复 分享
发布于 2020-08-25 20:20

相关推荐

6 28 评论
分享
牛客网
牛客企业服务