CSP-J2022 复盘

T1 乘方

方法 1:使用快速幂,判断答案是否 109

方法 2:特判 1 的情况,其余的可以直接乘。

此处给出方法 2 的代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
int main(){
cin>>a>>b;
if(a==1) cout<<1;
else{
ll res=1;
for(int i=1;i<=b;i++){
res*=a;
if(res>1e9){cout<<-1;return 0;}
}
cout<<res;
}
return 0;
}

T2 解密

思路:

mi=niei×di+2

根据已知信息,可以推出 pi×qi=nipi+qi=niei×di+2=mi

ni,ei,di 均为已知数,因此本题转换为:

已知 pi+qi=mipi×qi=ni,求 pi,qi

piqi=(pi+qi)24×pi×qi=mi24ni

pi2qi2=(pi+qi)(piqi)=mi×mi24ni

pi2+qi2=(pi+qi)22piqi=mi22ni

2pi2=m×mi24ni+mi22ni

pi2=m×mi24ni+mi22ni2

pi=m×mi24ni+mi22ni2

pi=2mi×mi24ni+2mi24ni2

注意到 2mi×mi24ni+2mi24ni 是个完全平方公式。

继续化简得 pi=mi+mi24ni2

qi=mipi=mimi+mi24ni2=mimi24ni2

综上,
{pi=mi+mi24ni2qi=mimi24ni2

注意如果 piqi 大则交换 pi,qi

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
ll k,n,d,e;
int main(){
cin>>k;
for(int i=1;i<=k;i++){
cin>>n>>d>>e;
ll m=n-e*d+2;
ll tmp1=m*m-4*n;
if(tmp1<0){
cout<<"NO"<<endl;
continue;
}
ll p=(m+sqrt(tmp1))/2;
ll q=m-p;
if(p>q) swap(p,q);
if(p*q==n&&p>0) cout<<p<<" "<<q<<endl;
else cout<<"NO"<<endl;
}
return 0;
}

根据这道题,还可以得出一个普遍的结论:

已知 a+b=n,a×b=m


{a=n+n24m2b=nn24m2

T3 逻辑表达式

考场上没有考虑到优化

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
string str;
int ch1[200009],ch2[200009],t1[200009],t2[200009],ans1,ans2,ans;
int solve(int l,int r){
if(l==r) return (str[l]-'0');
if(ch2[r]>=l){
int anst=solve(l,ch2[r]-1);
if(anst==1){
ans2++;
return 1;
}
else return solve(ch2[r]+1,r);
}
else if(ch1[r]>=l){
int anst=solve(l,ch1[r]-1);
if(anst==0){
ans1++;
return 0;
}
else return solve(ch1[r]+1,r);
}
else return solve(l+1,r-1);
}
int main(){
cin>>str;
for(int i=0;i<str.size();i++) ch1[i]=ch2[i]=t1[i]=t2[i]=-1;
int flr=0;
for(int i=0;i<str.size();i++){
if(str[i]=='(') flr++;
if(str[i]==')') flr--;
if(str[i]=='&') t1[flr]=i;
if(str[i]=='|') t2[flr]=i;
ch1[i]=t1[flr];
ch2[i]=t2[flr];
}
ans=solve(0,str.size()-1);
cout<<ans<<endl<<ans1<<" "<<ans2<<endl;
return 0;
}

T4 上升点列

我是傻逼。

我把 x 写成 y 了。

每个大样例都过了。

100pts65pts

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct star{
ll x,y;
};
ll n,k,f[509][109];
star s[509];
bool cmp(const star&a,const star&b){
return a.x<b.x||a.x==b.x&&a.y<=b.y;
}
int main(){
cin>>n>>k;
for(ll i=1;i<=n;i++){
cin>>s[i].x>>s[i].y;
}
sort(s+1,s+1+n,cmp);
ll ans=0;
for(ll i=1;i<=n;i++){
f[i][k]=1;
for(ll j=1;j<i;j++){
if(s[j].x>s[i].x||s[j].y>s[i].y) continue;
ll dis=abs(s[i].x-s[j].x)+abs(s[i].y-s[j].y)-1;
for(ll l=0;l+dis<=k;l++){
if(f[j][l+dis]){
f[i][l]=max(f[i][l],f[j][l+dis]+dis+1);
}
}
}
}
for(ll i=1;i<=n;i++){
for(ll j=0;j<=k;j++){
ans=max(ans,f[i][j]+j);
}
}
cout<<ans;
return 0;
}
posted @   11jiang08  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示