大家笔试做的怎么样!
![](https://static.nowcoder.com/images/vote-placeholder.png)
我快速做完第一题后,被二三题的内存超限弄得怀疑人生。。直接不看第四题提前交卷了。
顺便求大佬看看我的代码究竟哪里错了。。
第二题:(内存超限)
思路:找出最矮的楼,ans=最矮的楼高度×楼的数量,然后以最矮的楼为界分出左右两块,然后在新的数组里面接着找最矮的楼,ans=最矮的楼高度×楼的数量,找出最大的ans。
#include<bits/stdc++.h> using namespace std; vector<int> s; void back(int& ans ,int l,int r){ if(r-l<=1) return ; int len=r-l+1,min=10000,flag; for(int i=l;i<l+len;++i){ if(min>s[i]){ min=s[i]; flag=i; } } if(min*len>ans) ans=min*len; if(flag==l) return ; back(ans,l,flag-1); back(ans,flag+1,r); return ; } int main(){ int n,h; cin>>n; //vector<int> v(n); int min=10000; for(int i=0;i<n;++i){ cin>>h; s.push_back(h); if(h<min){ min=h; } } int ans=min*n; back(ans,0,n-1); cout<<ans; }
第三题(样例通过,但输出0%):
思路:一位位加上去,每加一位数字就判断三个条件是否满足。
#include<bits/stdc++.h> using namespace std; void back(const int &n,const int &s,const int &x,int r,int add,int num,int&count){ if(r>=n || add>=s) { if(add==s && r==n) count=(count+1)%1000009; return; } for(int i=0;i<10;++i){ int temp=num; if(num>99) num=num%100; num=num*10+i; if(num%x==0 || r<3) { ++r; add+=i; back(n,s,x,r,add,num,count); add-=i; --r; } else num=temp; } return; } int main(){ int n,s,x; cin>>n>>s>>x; int count=0; back(n,s,x,0,0,0,count); cout<<count+1; }