# 非官方题解 | CXXP#1题解
2026-02-21 13:01:37
发布于:浙江
前言:
这期还是采用我的CuSn马蜂,很方便哈
难度:
- 红 橙 黄 绿
蓝 紫 黑
T1:一个格的价
思路解析
这题其实很简单:给定皮皮虾等级 ( S ) 和质量 ( x )(克),求应付金额。
-
等级与每千克单价对应关系:
- ( A ) 级:( 60 ) 元/kg
- ( B ) 级:( 45 ) 元/kg
- ( C ) 级:( 30 ) 元/kg
-
质量单位是克,要换算成千克。
-
应付金额:
-
输出保留两位小数。
代码实现
namespace CuSn{
void solve(){
char s;
int x;
cin>>s>>x;
double p;
if(s=='A')p=60.0;
if(s=='B')p=45.0;
if(s=='C')p=30.0;
double ans=x/1000.0*p;
printf("%.2f",ans);
}
}
T2:一个戏的游
思路解析
我们有 个技能,每个技能有冷却 和伤害 。
系统按顺序给出 个强化点,每个强化点指定给某个技能 :
- 类型 :伤害增加
- 类型 :伤害增加 (向下取整)
最后计算平均伤害和:
结果对 取模。
(这个不确定要不要,先挂这)
代码实现
namespace CuSn{
void solve(){
long long n,m;
cin>>n>>m;
long long co[150],da[150];
for(int i=1;i<=n;i++)cin>>co[i]>>da[i];
for(int i=1;i<=m;i++){
long long op,val,id;
cin>>op>>val>>id;
if(op==1)da[id]+=val;
else da[id]=da[id]*(100+val)/100;
}
double sum=0;
for(int i=1;i<=n;i++)sum+=da[i]*1.0/co[i];
cout<<(long long)sum%917809201<<'\n';
}
}
T3:一个宫的迷
思路解析
这是一个三维迷宫最短路问题。
- 迷宫尺寸为 ,每个格子是墙
#、路.、起点 或终点 。 - 移动方向:上下前后左右共 个方向。
- 求从起点到终点的最短步数,若不可达输出 。
由于 ,三维网格最多 个格子,直接用 BFS 求解即可。
代码实现
namespace CuSn{
int n,sx,sy,sz,ex,ey,ez;
char a[25][25][25];
int vis[25][25][25];
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
struct node{int x,y,z,step;};
void solve(){
cin>>n;
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j][k];
if(a[i][j][k]=='S')sx=i,sy=j,sz=k;
if(a[i][j][k]=='E')ex=i,ey=j,ez=k;
}
}
}
for(int i=1;i<=10000;i++);
memset(vis,0,sizeof vis);
queue<node> q;
q.push({sx,sy,sz,0});
vis[sx][sy][sz]=1;
while(!q.empty()){
node u=q.front();q.pop();
if(u.x==ex&&u.y==ey&&u.z==ez){
cout<<u.step<<'\n';
return;
}
for(int i=0;i<6;i++){
int nx=u.x+dx[i];
int ny=u.y+dy[i];
int nz=u.z+dz[i];
if(nx<0||nx>=n||ny<0||ny>=n||nz<0||nz>=n)continue;
if(vis[nx][ny][nz])continue;
if(a[nx][ny][nz]=='#')continue;
vis[nx][ny][nz]=1;
q.push({nx,ny,nz,u.step+1});
}
}
cout<<-1<<'\n';
}
}
T4:一个法的书
思路解析
题目问的是:经过若干次乘方操作后,能否用恰好 次相邻交换使数组变为非递减顺序。
关键点:
- 相邻交换排序的最小次数 = 逆序对数量(冒泡排序交换次数)
- 乘方操作会改变数值,但排序可行性只取决于能否用 次交换完成
判断方法:
- 若当前数组的逆序对数量 且 是偶数,则可以(因为可以多余交换来回抵消)
- 否则不行
代码实现
namespace CuSn{
long long n,k,m,votion;
long long a[100005],b[100005],tmp[100005];
long long merge(int l,int r){
if(l>=r)return 0;
int mid=(l+r)/2;
long long res=merge(l,mid)+merge(mid+1,r);
int i=l,j=mid+1,p=l;
while(i<=mid&&j<=r){
if(b[i]<=b[j])tmp[p++]=b[i++];
else{
tmp[p++]=b[j++];
res+=mid-i+1;
}
}
while(i<=mid)tmp[p++]=b[i++];
while(j<=r)tmp[p++]=b[j++];
for(int i=l;i<=r;i++)b[i]=tmp[i];
return res;
}
long long get(){
for(int i=1;i<=n;i++)b[i]=a[i];
return merge(1,n);
}
void solve(){
cin>>n>>k>>m;
for(int i=1;i<=n;i++)cin>>a[i];
long long cnt=get();
if(cnt<=k&&(k-cnt)%2==0)cout<<"Yes\n";
else cout<<"No\n";
for(int t=1;t<=m;t++){
cin>>votion;
for(int i=1;i<=n;i++){
long long res=1;
for(int j=1;j<=votion;j++)res*=a[i];
a[i]=res;
}
cnt=get();
if(cnt<=k&&(k-cnt)%2==0)cout<<"Yes\n";
else cout<<"No\n";
}
}
}
成功TLE&WA
正确代码:
Code:
namespace CuSn{
const int MX=100015;
int n,nn,p,ww,kk,fg;
bool rp[2];
long long K;
int va[MX],vb[MX],bit[MX];
long long res[2];
void rd(int &x){
x=0;
bool f=0;
char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=getchar();
if(c=='-'){f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
if(f)x=-x;
}
void rd(long long &x){
x=0;
bool f=0;
char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=getchar();
if(c=='-'){f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
if(f)x=-x;
}
int lb(int x){return x&-x;}
void add(int x,int v){for(;x<=nn;x+=lb(x))bit[x]+=v;}
int qry(int x){int r=0;for(;x;x-=lb(x))r+=bit[x];return r;}
int uniq(){
sort(vb+1,vb+n+1);
return unique(vb+1,vb+n+1)-vb-1;
}
bool ok(long long x){
return x<=K&&((K-x)%2==0||rp[fg]);
}
void solve(){
rd(n);rd(K);rd(kk);
fg=0;
for(int i=1;i<=n;i++){
rd(va[i]);
vb[i]=va[i];
}
nn=uniq();
rp[0]=nn<n;
for(int i=1;i<=n;i++){
p=lower_bound(vb+1,vb+nn+1,va[i])-vb;
res[0]+=qry(nn)-qry(p);
add(p,1);
}
memset(bit,0,sizeof bit);
for(int i=1;i<=n;i++)vb[i]=va[i]<0?-va[i]:va[i];
nn=uniq();
rp[1]=nn<n;
for(int i=1;i<=n;i++){
int now=va[i]<0?-va[i]:va[i];
p=lower_bound(vb+1,vb+nn+1,now)-vb;
res[1]+=qry(nn)-qry(p);
add(p,1);
}
if(ok(res[fg]))puts("Yes");
else puts("No");
while(kk--){
rd(ww);
if(ww%2==0)fg=1;
else fg=0;
if(ok(res[fg]))puts("Yes");
else puts("No");
}
}
}
总结:
- 代码有部分不太好
- 格式难看
- 难评
- ...
全部评论 3
votion
8小时前 来自 广东
0对
8小时前 来自 浙江
0错
8小时前 来自 广东
0?
8小时前 来自 浙江
0
细节发帖后自己给自己点赞
9小时前 来自 重庆
0我今天会给你的捏
9小时前 来自 浙江
1hhh
9小时前 来自 浙江
0我的名字——C u S n=C h u S h e n g=chusheng=CS
9小时前 来自 浙江
1
依旧吓哭QAQ
9小时前 来自 重庆
0























有帮助,赞一个