2022csp-j复赛试题讲解及答案
1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int a,b; 6 cin>>a>>b; 7 long long ans=1;//注意long long ,不能用int 8 for(int i=1; i<=b; i++) { 9 ans*=a; 10 if(ans>1e9) { 11 cout<<-1; 12 return 0; 13 } 14 } 15 cout<<ans; 16 return 0; 17 }
//60分代码 #include <iostream> using namespace std; long long n,e,d; int k; int main() { scanf("%d",&k); while(k--) { scanf("%lld %lld %lld",&n,&e,&d); int f=0; for(long long i=1; i*i<=n; i++) { if(n%i==0) { //找到了能够整除的数 if((i-1)*(n/i-1)+1==e*d) { f=1; printf("%lld %lld\n",i,n/i); break; } } } if(!f) printf("NO\n"); } return 0; }
1 #include <iostream>//满分代码 2 #include<cmath> 3 using namespace std; 4 long long n,e,d,p,q,t,m; 5 int k; 6 7 int main() { 8 scanf("%d",&k); 9 while(k--) { 10 scanf("%lld %lld %lld",&n,&e,&d); 11 m=n-e*d+2;//p+q=m,p*q=n 12 t=sqrt(m*m-4*n);//q-p=t 13 q=(m+t)/2; 14 p=m-q; 15 if(p*q==n&&e*d==(p-1)*(q-1)+1) printf("%lld %lld\n",p,q); 16 else printf("NO\n"); 17 } 18 return 0; 19 }
1 //P8816 [CSP-J 2022] 上升点列 2 #include <iostream> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int n,k; 7 struct points { 8 int x,y; 9 } p[510]; 10 11 bool cmp(const points a,const points b) { 12 if(a.x==b.x) return a.y<b.y; 13 else return a.x<b.x; 14 } 15 int f[510][110];//以i点为终点,再添加上j个点的情况下最大序列长度 16 int main() { 17 scanf("%d %d",&n,&k); 18 for(int i=1; i<=n; i++) { 19 scanf("%d %d",&p[i].x,&p[i].y); 20 } 21 sort(p+1,p+1+n,cmp); 22 int ans=0; 23 for(int i=1; i<=n; i++) {//以i为终点 24 for(int j=0; j<=k; j++) {//添加j个点 25 f[i][j]=j+1;//以i为终点,后续添加j个点最短的长度 26 for(int l=1; l<i; l++) { //l为i的前一个点 27 if(p[l].x<=p[i].x&&p[l].y<=p[i].y) {//横坐标、纵坐标值均单调不减 28 int t=p[i].x-p[l].x+p[i].y-p[l].y-1;//需要添加的点数量 29 if(j>=t) f[i][j]=max(f[i][j],f[l][j-t]+t+1); 30 //cout<<p[i].x<<p[l].x<<p[i].y<<p[l].y<<t<<endl; 31 } 32 //cout<<"i="<<i<<" j="<<j<<" l="<<l<<" f="<<f[i][j]<<endl; 33 } 34 35 ans=max(ans,f[i][j]); 36 } 37 } 38 printf("%d",ans); 39 return 0; 40 }
视频讲解地址:https://www.bilibili.com/video/BV1Cr4y1f7kp/?spm_id_from=333.999.0.0&vd_source=fa5102b0272af775d3bc4ab69fc72737
1 //P8815 [CSP-J 2022] 逻辑表达式 2 #include <iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<stack> 6 using namespace std; 7 char s[1000010]; 8 struct number { 9 int num; 10 int op1,op2; //&,| 11 }; 12 stack<number> n;//数字 13 stack<char> f; 14 int l; 15 void cul() { 16 number n2=n.top();//操作数1 17 n.pop(); 18 number n1=n.top();//操作数2 19 n.pop(); 20 char c=f.top(); 21 f.pop(); 22 23 int ans; 24 if(c=='&') { 25 ans=n1.num&n2.num; 26 if(n1.num==0) n.push({ans,n1.op1+1,n1.op2});//通过&操作 ,且短路 27 else n.push({ans,n1.op1+n2.op1,n1.op2+n2.op2}); 28 } else { 29 ans=n1.num|n2.num; 30 if(n1.num==1) n.push({ans,n1.op1,n1.op2+1});//通过|操作 ,且短路 31 else n.push({ans,n1.op1+n2.op1,n1.op2+n2.op2}); 32 } 33 //cout<<"cul"<<n1.num<<c<<n2.num<<'='<<ans<<" "<<n.top().op1<<' '<<n.top().op2<<endl; 34 return; 35 } 36 void work() { 37 for(int i=0; i<l; i++) { 38 if(s[i]=='0'||s[i]=='1') { 39 n.push({s[i]-'0',0,0}); 40 }//数字进栈 41 else if(s[i]=='(') { 42 f.push(s[i]); 43 } else if(s[i]=='&') { 44 while(!f.empty()&&f.top()=='&') { 45 cul(); 46 } 47 f.push(s[i]); 48 } else if(s[i]=='|') { 49 while(!f.empty()&&(f.top()=='|'||f.top()=='&')) { 50 cul(); 51 } 52 f.push(s[i]); 53 } else if(s[i]==')') { 54 while(!f.empty()&&f.top()!='(') { 55 cul(); 56 } 57 f.pop(); 58 } 59 } 60 while(!f.empty()) { 61 cul(); 62 } 63 } 64 65 int main() { 66 cin>>s; 67 l=strlen(s); 68 work(); 69 number t=n.top(); 70 cout<<t.num<<endl<<t.op1<<' '<<t.op2; 71 return 0; 72 }