如果我没记错的话应该是有题解的
感觉没问题
好的,但我不是巨佬,我是蒟蒻
o所以我哪里错了?
这题和这算法有啥关系
70了
ll dfs(ll x, ll step) {
if (mem[x].count(step)) return mem[x][step]; // 如果已经计算过,直接返回
if (step == 10) return ans; // 达到递归深度限制,返回结果
ll i = n / x + 1; // 计算下一个值
ll current_ans = ans;
// 计算最大值
if (i >= L && i <= R) current_ans = max(current_ans, n % i);
if (i != 0) current_ans = max(current_ans, dfs(n / i + 1, step + 1));
if (i > 1) current_ans = max(current_ans, dfs(n / (i - 1) + 1, step + 1));
// 存储结果
mem[x][step] = current_ans;
return current_ans;
}
这是最新代码 WA70:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
#define int long long
I AK IOI;
int n,m,ans,L,R;
unordered_map<int,unordered_map<int,int> >mem;
int dfs(int x,int step){
if(mem[x].count(step))return mem[x][step];
if(step==10) return ans;
int i=n/x+1;
int cur=ans;
if(i>=L&&i<=R)cur=max(cur,n%i);
if(i!=0)cur=max(cur,dfs(n/i+1,step+1));
if(i>1)cur=max(cur,dfs(n/(i-1)+1,step+1));
mem[x][step]=cur;
return cur;
}
signed main(){
cin>>n>>m;
int maxn=n/2+1,mmod=n%maxn;
while(m--){
cin>>L>>R;
if(L<=maxn&&maxn<=R)cout<<mmod<<endl;
else if(L>maxn)cout<<n-L<<endl;
else{
mem.clear();
ans=max(n%L,n%R);
int l1=0,l2=0;
int i1=n/L+1;
if(i1>=L&&i1<=R)ans=max(ans,n%i1);
int i2=n/R+1;
if(i2>=L&&i2<=R)ans=max(ans,n%i2);
int kl=n/L;
if(kl!=0)ans=max(ans,dfs(kl,0));
int kr=n/R;
if(kr!=0)ans=max(ans,dfs(kr,0));
cout<<ans<<endl;
}
}
i_ak ioi;
}
完了,对于我这个新手,根本就找不出问题啊!!!
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
#define int long long
#define R register
I AK IOI;
namespace fastIO{char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline void read(int&n){int x=0,f=1;char ch=nc();while(ch<48||ch>57){if(ch=='-'){f=-1;}ch=nc();}while(ch>=48&&ch<=57){x=(x<<3)+(x<<1)+(ch^48),ch=nc();}n=x*f;}
inline void read(string&s){s="";char ch=nc();while(ch==' '||ch=='\n'){ch=nc();}while(ch!=' '&&ch!='\n'){s+=ch,ch=nc();}}
inline void read(char&ch){ch=nc();while(ch==' '||ch=='\n'){ch=nc();}}
inline void write(int x){if(x<0){putchar('-'),x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');return;}
inline void write(const string&s){for(R int i=0;i<(int)s.size();i++){putchar(s[i]);}}
inline void write(const char&c){putchar(c);}
}using namespace fastIO;
int n,m,ans,L,R1;
unordered_map<int,unordered_map<int,int> >mem;
inline int dfs(const int &x,const int &step){
if(step==11) return ans;
if(mem[x].count(step))return mem[x][step];
int i=n/x+1;
int cur=ans;
if(i>=L&&i<=R1)cur=max(cur,n%i);
if(i!=0)cur=max(cur,dfs(n/i+1,step+1));
if(i>1)cur=max(cur,dfs(n/(i-1)+1,step+1));
mem[x][step]=cur;
return cur;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
read(n);
read(m);
int maxn=n/2+1,mmod=n%maxn;
while(m--){
read(L);
read(R1);
if(L<=maxn&&maxn<=R1){
write(mmod);
putchar('\n');
}
else if(L>maxn){
write(n-L);
putchar('\n');
}
else{
mem.clear();
ans=max(n%L,n%R1);
int l1=0,l2=0;
int i1=n/L+1;
if(i1>=L&&i1<=R1)ans=max(ans,n%i1);
int i2=n/R1+1;
if(i2>=L&&i2<=R1)ans=max(ans,n%i2);
int kl=n/L;
if(kl!=0)ans=max(ans,dfs(kl,0));
int kr=n/R1;
if(kr!=0)ans=max(ans,dfs(kr,0));
write(ans);
putchar('\n');
}
}
i_ak ioi;
}
此帖子已被社区举报,现已被临时隐藏。