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