CSP-J 2021 考试总结 & 题解

先来吐槽一下 €€£ 的数据,第一题把我卡成了 \(90\),第二题卡成了 \(12\),最后一道题还多水了 \(10\) 分。

总得分:\(90+12+65+40=207\)。

应该得的分:\(100+52+65+60=277\)

如果再好一点就是:\(100+52+65+100=317\)


第一题:我只能说我不会写对拍,手造的几组数据全都对了。

我一不小心取到了 \(n\) 的这个值,所以在范围很小的时候把我卡掉了。


第二题:结构体掌握度不够,平常不怎么使用结构体的。

或者说时间也不够了,大量的时间花在了第 \(3\) 题。(我倒回来做的第 \(2\) 题)


第三题:这个怎么说呢,其实我早就知道我写出来的程序有一定概率会错,但是我就是不知道怎么改。

模拟能力太菜了属于是。


第 \(4\) 题:一个重大的失误,数组开小了,丢了 \(20\) 分

以后我要 const int N=1e...

题解

第一题没什么好说的:

#include<iostream>
using namespace std;
int main(){
    int n,l,r;
    cin>>n>>l>>r;
    int w=r-l;
    int t=l%n;
    if(w+t<n) cout<<w+t;
    else cout<<n-1;
}

第二题就模拟一下,卡卡常也许就过了。

第三题也就一个模拟,可以投机取巧做一下。

第 \(4\) 题用一个 set 模拟就可以了

#include<bits/stdc++.h>
const int INF=200005;
using namespace std;
int n;
set<int>s1,s2;
int cur;
bool p;
int main(){
	cin>>n;
	
	for(int i=1;i<=n;i++){
		int q;
		cin>>q;
		if(q){
			s1.insert(i);//苹果 
		}
		else{
			s2.insert(i);//橘子 
		}
	}
	s1.insert(INF);
	s2.insert(INF);
	if(*s1.begin()<*s2.begin()){
		p=0;
	}
	else p=1;
	while((!p&&s1.size()>1)||(p&&s2.size()>1)){
		if(!p){
			cur=*s1.upper_bound(cur);
			if(cur==INF){
				cur=0;
				if(*s1.begin()<*s2.begin()){
					p=0;
				}
				else p=1;
				cout<<endl;
				continue;
			}
			cout<<cur<<' ';
			s1.erase(cur);
			p=!p; 
		}
		else{
			cur=*s2.upper_bound(cur);
			if (cur==INF){
				cur=0;
				if(*s1.begin()<*s2.begin()){
					p=0;
				}
				else p=1;
				cout<<endl;
				continue;
			}
			cout<<cur<<' ';
			s2.erase(cur);
			p=!p;
		}
	}	
	cout<<endl;
	while(s1.size()>1){
		cout<<*s1.begin()<<endl;
		s1.erase(*s1.begin());
	}
	while(s2.size()>1){
		cout<<*s2.begin()<<endl;
		s2.erase(*s2.begin());
	}
}

明年继续!

上一篇:PTA--删除字符串中的子串


下一篇:中缀表达式转后缀表达式