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