第一题 乘方

【题目描述】
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 ab
,求 ab 的值是多少。
abba 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2 × 2 × 2 = 8。
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 int 类型的。在大多数机器上,int 类型
能表示的最大数为 2 31 1 ,因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 ab
值超过 109 时,输出一个 ‐1 进行警示,否则就输出正确的 ab 的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。
【输入格式】
从文件 pow.in 中读入数据。
输入共一行,两个正整数 a, b
【输出格式】
输出到文件 pow.out 中。
输出共一行,如果 ab 的值不超过 109 ,则输出 ab 的值,否则输出 ‐1 。
【样例 1 输入】
10 9
【样例 1 输出】
1000000000
【样例 2 输入】
23333 66666
【样例 2 输出】
‐1

解题流程

1. 开a,b变量+输入

*特殊情况:如果a等于1直接输出1

2. 开变量n,每次循环里会增加一次a

3. for循环0~b-1次循环求幂

n求幂,每次乘a

判断最新的数字是否大于10^9

是:输出-1,结束运行

否:继续for循环

4. 输出最终答案n

注意事项

1. 两个变量记得开ll或者ull 都行 反正int过不了

2. 场上freopen的文件名别写错

3. 想我这种手敲了10^9的数清楚几个0

4. n变量初始值为1

代码

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

第二题 解密

【题目描述】
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni , ei , di,求两个正整数 pi , qi
使 ni = pi × qi , ei × di = (pi 1)(qi 1) + 1。
【输入格式】
从文件 decode.in 中读入数据。
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 ni , di , ei
【输出格式】
输出到文件 decode.out 中。
输出 k 行,每行两个正整数 pi , qi 表示答案。
为使输出统一,你应当保证 pi qi
如果无解,请输出 NO。 
【样例 1 输入】
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263 
528 4 109
【样例 1 输出】
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88

解题思路

简单来说,就是求一元二次方程然后带进代码里求值就可以了(排除特殊NO情况)!!!!!看到k , n , e , d 的范围就知道要推公式,数据范围提示很明显的了。所以m是怎么来的呢? 很简单 如果距离事1,就输出NO,同样如果x小于0也会输出NO。接下来用一般的方法就行了

解题流程

1. 分两个函数(方便看)先分read和主函数

2. 带入read函数,判断数字和符号

3. 把NO的情况单独分出来(m如果距离是1,x<0)

4. 带入一元二次公式 求p,q

5. 输出

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;inline ll read()
{ll x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}return x*f;
}int main(){ int k=read();while(k--){ll n=read(),d=read(),e=read();ll x=e*d-n-2;x=-x; double s=sqrt(x*x-4*n);if(x<0||x*x-4*n<0||s!=int(s)){printf("NO\n");continue;         }int ss=s;if((-x-ss)&1||(-x+ss)&1){printf("NO\n");return 0;}int yy=(-x-ss)/(-2),xx=(-x+ss)/(-2);if(xx<=0||yy<=0){printf("NO\n");return 0;              }printf("%d %d\n",xx,yy);}return 0;
}

第三题 逻辑表达式

【题目描述】
逻辑表达式是计算机科学中的重要概念和工具,包含逻辑值、逻辑运算、逻辑运算
优先级等内容。
在一个逻辑表达式中,元素的值只有两种可能:0 (表示假)和 1 (表示真)。元素
之间有多种可能的逻辑运算,本题中只需考虑如下两种:“与”(符号为&)和“或”(符
号为|)。其运算规则如下:
0&0 = 0&1 = 1&0 = 0,1&1 = 1;
0|0 = 0,0|1 = 1|0 = 1|1 = 1。
在一个逻辑表达式中还可能有括号。规定在运算时,括号内的部分先运算;两种运
算并列时,& 运算优先于 | 运算;同种运算并列时,从左向右运算。
比如,表达式 0|1&0 的运算顺序等同于0|(1&0) ;表达式 0&1&0|1 的运算顺序等
同于 ((0&1)&0)|1。
此外,在 C++ 等语言的有些编译器中,对逻辑表达式的计算会采用一种“短路”
的策略。:在形如 a&b 的逻辑表达式中,会先计算 a 部分的值,如果 a = 0 ,那么整个
逻辑表达式的值就一定为 0,故无需再计算 b 部分的值;同理,在形如 a|b 的逻辑表达
式中,会先计算 a 部分的值,如果 a = 1 ,那么整个逻辑表达式的值就一定为 1,无需
再计算 b 部分的值。
现在给你一个逻辑表达式,你需要计算出它的值,并且统计出在计算过程中,两种
类型的“短路”各出现了多少次。需要注意的是,如果某处“短路”包含在更外层被“短
路”的部分内则不被统计,如表达式 1|(0&1) 中,尽管 0&1 是一处“短路”,但由于外
层的 1|(0&1) 本身就是一处“短路”,无需再计算 0&1 部分的值,因此不应当把这里的
0&1 计入一处“短路”。

【输入格式】

从文件 expr.in 中读入数据。
输入共一行,一个非空字符串 s 表示待计算的逻辑表达式。
【输出格式】
输出到文件 expr.out 中。
输出共两行,第一行输出一个字符 0 或 1 ,表示这个逻辑表达式的值;第二行输
出两个非负整数,分别表示计算上述逻辑表达式的过程中,形如 a&b 和 a|b 的“短路”
各出现了多少次。

解题思路

直接开数组,分calc和build函数分别为运算,和判断符号的函数。用布尔类的函数dfs返回每个值,分别是 ( 和 |  和 &。到时候带入build和calc所以调用dfs函数的数里面就是build。dfs(build())

解题流程

1. 分4个函数 calc做运算 build判断01和符号 dfs(布尔)做符号判断的根本 和主函数

2. 输入字符串

3. 拆分成op和num 逐个运算

4. 计算“短路”情况“

5. 两个结果输出

代码

#include <bits/stdc++.h>
using namespace std; int n,ch[1000010][2],root,num[1000010],op[1000010],pri[1<<10],topn,topo;
char s[1000010];
void calc(){int u=op[topo];ch[u][0]=num[topn-1],ch[u][1]=num[topn];topo--,topn-=2,num[++topn]=u;
}
int build(){topn=0,topo=0;s[0]='(',s[n+1]=')'; for(int i=0;i<=n+1;i++){if(s[i]=='0'||s[i]=='1') num[++topn]=i;else if(s[i]=='(') op[++topo]=i;else if(s[i]=='&'||s[i]=='|'){while(topo&&pri[s[op[topo]]]<pri[s[i]]) calc();op[++topo]=i;}else if(s[i]==')'){while(topo&&pri[s[op[topo]]]<pri[s[i]]) calc();topo--;}}return num[topn];
}
int cnt1,cnt0;
bool dfs(int u){if(s[u]=='0') return 0;if(s[u]=='1') return 1;if(s[u]=='&'){if(!dfs(ch[u][1])) return cnt0++,0;return dfs(ch[u][0]);}if(s[u]=='|'){if(dfs(ch[u][1])) return cnt1++,1;return dfs(ch[u][0]);}return -1;
}
int main(){ scanf("%s",s+1),n=strlen(s+1);pri['(']=1e9,pri['|']=1,pri['&']=0,pri[')']=1e9-1;reverse(s+1,s+n+1);for(int i=1;i<=n;i++){if(s[i]=='(') s[i]=')';else if(s[i]==')') s[i]='(';}printf("%d\n",dfs(build()));printf("%d %d\n",cnt0,cnt1);return 0;
} 

第四题 上升点列

【题目描述】
在一个二维平面内,给定 n 个整数点 (xi , yi),此外你还可以自由添加 k 个整数点。
你在自由添加 k 个点后,还需要从 n + k 个点中选出若干个整数点并组成一个序列,使
得序列中任意相邻两点间的欧几里得距离恰好为 1 而且横坐标、纵坐标值均单调不减,
xi+1 xi = 1, yi+1 = yiyi+1 yi = 1, xi+1 = xi。请给出满足条件的序列的最大长
度。
【输入格式】
从文件 point.in 中读入数据。
第一行两个正整数 n, k 分别表示给定的整点个数、可自由添加的整点个数。
接下来 n 行,第 i 行两个正整数 xi , yi 表示给定的第 i 个点的横纵坐标。
【输出格式】
输出到文件 point.out 中。
输出一个整数表示满足要求的序列的最大长度。
【样例 1 输入】
 8 2
 3 1
 3 2
 3 3
 3 6
 1 2
 2 2
 5 5
 5 3
【样例 1 输出】
 8

解题思路

状态dp题,但是要分别xy点转移方程。先看n , k 的范围,显然可在O ( n 2 k ) 复杂度解决。状态怎么找呢?看答案的转移需要哪些条件,其转移与序列最后一个点的坐标和添加点的个数有关。

解题流程

1. 分布尔函数cmp 和猪函数main。cmp创建数轴上的点Node,主函数运行

2. 输入nk和所有点

3. 判断绝对值,输出ans+k的值

代码

#include<bits/stdc++.h>
using namespace std ;
const int Max = 5e2 + 10 , TIL = ( 1 << 28 ) ;
struct Node { int X , Y ; } T[Max] ;
int F[Max][Max] , Con[Max][Max] ;
int N , K ;
bool CMP( Node A , Node B ) {if( A.X == B.X ) return A.Y < B.Y ; else return A.X < B.X ;
}
int Ans ;
int main( ) {scanf("%d%d" , &N , &K ) ;for(int i = 1 ; i <= N ; i ++ ) scanf("%d%d" , &T[i].X , &T[i].Y ) , Con[i][0] = 0 ;sort( T + 1 , T + N + 1 , CMP ) ; for(int i = 1 ; i <= N ; i ++ ) for(int l = 1 ; l <= N ; l ++ )Con[i][l] = abs( T[i].X - T[l].X ) + abs( T[i].Y - T[l].Y ) - 1 ; for(int i = 1 ; i <= N ; i ++ ) F[i][0] = 1 ;for(int P = false ; P <= K ; P ++ ) for(int i = 2 ; i <= N ; i ++ ) for(int l = 0 ; l <= i - 1 ; l ++ ) if( Con[i][l] <= P && T[l].X <= T[i].X && T[l].Y <= T[i].Y ) F[i][P] = max( F[i][P] , F[l][P - Con[i][l]] + 1 ) ;for(int i = 1 ; i <= N ; i ++ ) for(int P = false ; P <= K ; P ++ ) Ans = max( Ans , F[i][P] ) ;printf("%d\n" , Ans + K ) ; return false ;
}

2022 CSP-J 复赛题解相关推荐

  1. 2020 CSP - J初赛 题解

    目录 写在前面的话 题面 题解 答案合集 单项选择题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 阅读程序题 一 16 17 18 19 20 21 二 22 23 24 ...

  2. 凡人升天传7——NOIP2010 提高组复赛题解

    本蒟蒻在考试时最后一道直接报零*__*,悲痛欲绝,因此在这里著下本题解. 可恶的西西弗 虽然题目做的很垃圾,但在写题解中途不得不感叹除了最后一道,其他真是好水题呀!!! --------------- ...

  3. CSP - J 2020 T1 优秀的拆分

    https://www.luogu.com.cn/problem/P7071 /* CSP - J 2020 T1 优秀的拆分 https://www.luogu.com.cn/problem/P70 ...

  4. 历届CSP真题题解-CSP刷真题之路

    历届CSP真题题解-CSP刷真题之路(持续更新中...) 2020-12 2020-09 2020-06 2019-12 2020-12 题目编号 题解链接 CSP202012-1 期末预测之安全指数 ...

  5. Arab Security Cyber Wargames 2022 Qualifications corCTF 部分题解

    文章目录 ASCWQ 2022 Crypto Rsa In The Wild OSP Misc Weird FS corCTF 2022 Crypto tadpole luckyguess excha ...

  6. CSP 2021 复赛游记

    今天虽然没有夏天那么热,但还是缺少了昨天的凉风,让人感觉穿上衣服就热,脱掉衣服就冷.在这天气下,一年一度的 CSP 又开始了. Junior 组 我乘坐着坐过许多次的地铁,走着几年前走过的路,到达了熟 ...

  7. 【零一原创】2020 CSP-J 复赛题解 400分攻略

    以下给出:2020年csp-j入门级复赛真题,题解,以及程序. 优秀的拆分(power) [题目描述] 般来说,一个正整数可以拆分成若干个正整数的和.例如,1=1,10=1+2+3+4等.对于正整数n ...

  8. CCF CSP认证考试题解目录

    由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...

  9. CSP-J2020复赛题解

    T1:优秀的拆分 首先排除所有奇数,然后考虑如果这个数大于222的kkk次方,那就从 2k22^k\text{~}22k 2 一直减下去,如果出现了000那么就成功,否则失败 #include < ...

最新文章

  1. SAP RETAIL分配表的查询报表
  2. 日本16岁编程少年,课余打造一款新冠感染追踪App
  3. UVA11020 优势人群(multiset)
  4. 结构型模式:桥接模式
  5. Angular Jasmine 里一些常用概念学习笔记 - describe, it, beforeEach的用法
  6. 分享25个CSS前端网页设计常用技巧
  7. springboot2.x 与 elasticsearch2.4.x整合出错:None of the configured nodes are available
  8. android cocos2dx 3.15.1创建工程,Cocos2d-x创建android项目(cocos2d-x系列三)
  9. matplotlib.text.Text
  10. python3文档字符串_python3基础:字符串、文本文件
  11. 【SQL Server】入门教程-基础篇(二)
  12. 人机交互(HCI)界面设计(笔记)
  13. mivo tv android,MivoTV Live Streaming
  14. lwip---(五)以太网数据接收
  15. sci计算机论文发表论文格式,SCI论文发表的格式以及字体的要求是什么?
  16. 计算机 360云盘删除,如何删除电脑右键菜单中的保存到360云盘选项
  17. 使用小波包变换分析信号的matlab程序,使用小波包变换分析信号的MATLAB程序
  18. Qt实现多摄像头的识别、显示、截图、分辨率帧率设置等功能
  19. 聊聊职场 - 个人发展
  20. Quectel EC200A-CN移植

热门文章

  1. aka名字_AKA是什么意思?
  2. 商业模式创新与设计 -- 黄力泓
  3. 管理信息系统基础知识点
  4. CSS3实现自适应的聊天气泡
  5. redis-shake 同步redis数据
  6. 暑假?不进厂?那就卷s同学吧
  7. Visual Studio 2002 下载地址 V7.0各种版本官方下载网址
  8. css中创建主轴方向,flex-direction
  9. asp.net基于net的小美果蔬批发网-蔬菜商城系统-计算机毕业设计
  10. 游戏美术行业的薪资待遇,人与人的差距真的在于努力,来看看数据吧