【网易】牛客网2019校招真题(编程题)
【题解】打表找规律,n为3的倍数和3的倍数余2的都是可以的,3的倍数余1的数是不可以的。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int l,r,sum1,sum2; 6 scanf("%d%d",&l,&r); 7 l--; 8 if(l%3==0)sum1=l/3*2; 9 else if(l%3==2)sum1=((l+1)/3*2)-1; 10 else sum1=(l-1)/3*2; 11 if(r%3==0)sum2=r/3*2; 12 else if(r%3==2)sum2=((r+1)/3*2)-1; 13 else sum2=(r-1)/3*2; 14 printf("%d\n",sum2-sum1); 15 }
【题解】简单模拟题。分类讨论即可。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n; 6 char s[1005]; 7 scanf("%d",&n); 8 scanf("%s",s); 9 char now='N'; 10 for(int i=0;i<n;i++) 11 { 12 if(now=='N') 13 { 14 if(s[i]=='L')now='W'; 15 else now='E'; 16 } 17 else if(now=='W') 18 { 19 if(s[i]=='L')now='S'; 20 else now='N'; 21 } 22 else if(now=='S') 23 { 24 if(s[i]=='L')now='E'; 25 else now='W'; 26 } 27 else 28 { 29 if(s[i]=='L')now='N'; 30 else now='S'; 31 } 32 } 33 printf("%c\n",now); 34 }
【题解】记录一下每一列的方块的个数,最后取个最小值。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,m,a[1005]; 6 scanf("%d%d",&n,&m); 7 int x; 8 memset(a,0,sizeof(a)); 9 for(int i=1;i<=m;i++) 10 { 11 scanf("%d",&x); 12 a[x]++; 13 } 14 int ans=0x3f3f3f3f; 15 for(int i=1;i<=n;i++) 16 { 17 //printf("%d\n",a[i]); 18 ans=min(ans,a[i]); 19 } 20 printf("%d\n",ans); 21 }
【题解】贪心。每放置一个路灯,连续3个位置都能照亮,所以遇到一个“.”放一个路灯,后面两个位置即可跳过。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[1005]; 4 int main() 5 { 6 int T; 7 scanf("%d",&T); 8 while(T--) 9 { 10 int n,i=0,ans=0; 11 scanf("%d",&n); 12 scanf("%s",s); 13 while(i<strlen(s)) 14 { 15 if(s[i]=='.') 16 { 17 ans++; 18 i+=3; 19 } 20 else i++; 21 } 22 printf("%d\n",ans); 23 } 24 }
【题解】将每一堆苹果做一个前缀和,可以得出从左往右数前i堆苹果的总数sum[i],对于每一次询问,只需查找第一个大于等于q的sum,考虑时间需要用二分查找(自己手写或者lower_bound都可)。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 int a[maxn],sum[maxn]; 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&a[i]); 12 sum[i]=sum[i-1]+a[i]; 13 } 14 int T; 15 scanf("%d",&T); 16 while(T--) 17 { 18 int q; 19 scanf("%d",&q); 20 int p=lower_bound(sum+1,sum+1+n,q)-sum; 21 printf("%d\n",p); 22 } 23 }
【题解】水题。总共6种情况,比较一下即可。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int a,b,c; 6 scanf("%d%d%d",&a,&b,&c); 7 int d=(a+b)*c; 8 int e=a+b*c; 9 int f=a*b+c; 10 int g=a*(b+c); 11 int h=a+b+c; 12 int j=a*b*c; 13 printf("%d\n",max(h,max(j,max(d,max(e,max(f,g)))))); 14 }
【题解】水题。化成分钟比较好算,所需决定起床时间=到教室时间-起床时间,然后把闹钟的时间从大到小排个序,这样只要找到第一个小于等于所需决定起床时间即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[105]; 4 bool cmp(int a,int b) 5 { 6 return a>b; 7 } 8 int main() 9 { 10 int n,h,m,x; 11 scanf("%d",&n); 12 for(int i=0;i<n;i++) 13 { 14 scanf("%d%d",&h,&m); 15 a[i]=h*60+m; 16 } 17 sort(a,a+n,cmp); 18 scanf("%d",&x); 19 scanf("%d%d",&h,&m); 20 int res=h*60+m-x; 21 for(int i=0;i<n;i++) 22 { 23 if(a[i]<=res) 24 { 25 printf("%d %d\n",a[i]/60,a[i]%60); 26 return 0; 27 } 28 } 29 }