D
比赛时:
#include<bits/stdc++.h>
using namespace std;
int ans[210][210];
int mann=0,temp=0;
int zz=4000000;
//int z1=0,z2=0,z3=0,z4=0;
void d1(int a,int b){
if(ans[a][b]==0) return ;
temp+=ans[a][b];
//z1++;
d1(a+1,b+1);
}
void d2(int a,int b){
if(ans[a][b]==0) return ;
temp+=ans[a][b];
//z2++;
d2(a+1,b-1);
}
void d3(int a,int b){
if(ans[a][b]==0) return ;
temp+=ans[a][b];
//z3++;
d3(a-1,b+1);
}
void d4(int a,int b){
if(ans[a][b]==0) return ;
temp+=ans[a][b];
//z4++;
d4(a-1,b-1);
}
int main(){
ios::sync_with_stdio(0);
cout.tie(0);cin.tie(0);
int q;
int n,m;
cin>>q;
while(q--){
memset(ans,0,sizeof(ans));
mann=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ans[i][j];
// for(int i=1;i<=n;i++)
// for(int j=1;j<=m;j++)
// cout<<ans[i][j]<<' ';
//cout<<endl;
//cout<<ans[5][5]<<endl;
// cout<<endl;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
temp=ans[i][j];
// z1=z2=z3=z4=0;
d1(i+1,j+1);
d2(i+1,j-1);
d3(i-1,j+1);
d4(i-1,j-1);
mann=max(mann,temp);
// if(i==3 and j==3)
// cout<<z1<<' '<<z2<<' '<<z3<<' '<<z4<<endl;
}
cout<<mann<<endl;
}
return 0;
}
Wrong answer on test 2
错误:可能是递归边界错误。
修改后:
#include<bits/stdc++.h>
using namespace std;
int ans[210][210];
int mann=0,temp=0,n,m;;
void d1(int a,int b){
if(a>n || a<1 || b>m || b<1) return ;
temp+=ans[a][b];
d1(a+1,b+1);
}
void d2(int a,int b){
if(a>n || a<1 || b>m || b<1) return ;
temp+=ans[a][b];
d2(a+1,b-1);
}
void d3(int a,int b){
if(a>n || a<1 || b>m || b<1) return ;
temp+=ans[a][b];
d3(a-1,b+1);
}
void d4(int a,int b){
if(a>n || a<1 || b>m || b<1) return ;
temp+=ans[a][b];
d4(a-1,b-1);
}
int main(){
ios::sync_with_stdio(0);
cout.tie(0);cin.tie(0);
int q;
cin>>q;
while(q--){
mann=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ans[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
temp=ans[i][j];
d1(i+1,j+1);
d2(i+1,j-1);
d3(i-1,j+1);
d4(i-1,j-1);
mann=max(mann,temp);
}
cout<<mann<<endl;
}
return 0;
}
总结:
一个点没过时,可以考虑换一下条件。
dfs可以换一下结束的条件。
dfs用数组的边界来判断。
E
贪心,前缀和,二分
#include<bits/stdc++.h>
using namespace std;
#define N 150010
int ans[N],sum[N]={0};
bool cmp(int a,int b){
return a>b;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int q,n,m;
cin>>q;
while(q--){
memset(ans,0,sizeof(ans));
//sum[0]=0;
memset(sum,0,sizeof(sum));
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>ans[i];
//for(int i=1;i<=m;i++)
// cin>>arr[i];
sort(ans+1,ans+1+n,cmp);
for(int i=1;i<=n;i++)
sum[i]+=sum[i-1]+ans[i];
//for(int x:sum) cout<<x<<' ';
//cout<<endl;
//for(int i=0;i<=n;i++)
// cout<<sum[i]<<' ';
// cout<<endl;
while(m--){
long long x; cin>>x;
int l=1,r=n,t=-1;
sum[0]=0;
while(l<=r){
int mid=(l+r)/2;
if(x<=sum[mid]){
t=mid;//并不能直接判断t最小
r=mid-1;
// cout<<11111111111<<endl;
// cout<<sum[mid];
// cout<<' '<<mid<<' '<<r<<endl;
//goto label;
}
else{
l=mid+1;
// cout<<222222222<<endl;
}
}
cout<<t<<'\n';
}
}
}