大家笔试做的怎么样!
我快速做完第一题后,被二三题的内存超限弄得怀疑人生。。直接不看第四题提前交卷了。
顺便求大佬看看我的代码究竟哪里错了。。
第二题:(内存超限)
思路:找出最矮的楼,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;
} 