2021CSP-J题解整合

放在一切的前面:

其实,这次我打的不是太好······

最后打了270多分······

oKCUsA.png

分数和排名···

其实,我们弱省这就是一等奖了,全国不高。

话说我只AC一道题就很离谱······


【题解】P7909 [CSP-J 2021] 分糖果

题意:

给定 n , L , R n,L,R n,L,R,选取一个正整数 k ( L ≤ k ≤ R ) k(L \le k \le R) k(LkR) ,使 k   m o d   n k\bmod n kmodn 的值 a n s ans ans最大,输出这个 a n s ans ans .

思路:

根据取余运算的定义,我们可以得到如下结论:

a n s ≤ n − 1 ans \le n-1 ansn1

也就说,我们要使 a n s ans ans尽可能地接近 n − 1 n-1 n1,有如下两种情况:

  1. 能找到一个 k   m o d   n = n − 1 k \bmod n = n-1 kmodn=n1 ,那么我们就输出 n − 1 n-1 n1
  2. 不能找到 k   m o d   n = n − 1 k \bmod n = n-1 kmodn=n1 ,那么我们就输出最接近 n − 1 n-1 n1的值。

做法:

我们求一个 z z z.

z = L   m o d   n z=L \bmod n z=Lmodn .

那么,在 k   m o d   n = n − 1 k \bmod n = n-1 kmodn=n1 中, k = n − 1 − z + L k=n-1-z+L k=n1z+L ;

我们只需要判定这个数字有没有超过 R R R 就可以:

  1. k ≤ R k \le R kR ,直接输出 k k k即可。
  2. k > R k > R k>R ,可得知 R   m o d   n R \bmod n Rmodn 不会变得更小,所以最大值是 R   m o d   n R \bmod n Rmodn.

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,l,r,z;
int main(){
	scanf("%lld%lld%lld",&n,&l,&r);
	z=l%n;
	if(n-1-z+l<=r) printf("%lld",n-1);
	else printf("%lld",r%n);
	return 0;
}


【题解】P7910 [CSP-J 2021] 插入排序

这道题,典型的模拟优化:

我们尽可能在修改时进行计算

博客园的简单记叙

我们先用 s o r t sort sort进行第一次,也是唯一一次查询,为了不改变原有数组的位置,我们用两个数组。

处理时,我们应该逐个比较,根据我们的需要来进行数位的动态维护

我们在第二类就可以直接输出。

代码在博客园里。


【题解】P7911 [CSP-J 2021] 网络连接

这道题典型的模拟;

模拟这个东西,其实很简单。

A+B问题就是最简单的模拟。

我们只要按照题意判定,然后就能得出AC代码。

易错点:

  • 前导零没有判断:
    建议在判断字符时直接判断。
  • 没有判断两个符号连接在一起的情况:
    建议判断是否有数字出现。
  • 数字难以处理:
    建议用数字记录:sum=sum*10+a[i]-'0';
  • 没有足够的符号:
    建议记录出现多少符号。

AC代码:

#include<bits/stdc++.h>
using namespace std;
map<string,bool> pd1;
map<string,int> pd2;
long long n;
struct computr{
	string s1,s2;
	long long id;
}a[1001];
int main(){
//	freopen("network.in","r",stdin);
//	freopen("network.out","w",stdout);
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++){
		cin>>a[i].s1>>a[i].s2;
		a[i].id=i;
		string t=a[i].s2;
		bool w=1;
		int pd=0;
		bool hnum=0,tpd=1;
		for(int j=0,sum=0;j<a[i].s2.size();j++){
			if(j==0){
				if(a[i].s2[j]=='0' and (a[i].s2[j+1]>='0' and a[i].s2[j+1]<='9')){
				    w=0;
					cout<<"ERR\n";
					break;
				}
			}
			if(a[i].s2[j]<'0' || a[i].s2[j]>'9'){
				tpd=1;
				if(a[i].s2[j+1]=='0' and (a[i].s2[j+2]>='0' and a[i].s2[j+2]<='9')){
				    w=0;
					cout<<"ERR\n";
					break;
				}
				if((pd==0||pd==1||pd==2) && a[i].s2[j]!='.'){
					w=0;
					cout<<"ERR\n";
					break;
				}
				else if(pd==3 && a[i].s2[j]!=':'){
					w=0;
					cout<<"ERR\n";
					break;
				}
				else if(!hnum){
					w=0;
					cout<<"ERR\n";
					break;
				}
				else sum=0,pd++,tpd=0;
				hnum=0;
			}
			else{
				if(a[i].s2[j-1]=='0' and !hnum){
					w=0;
					cout<<"ERR\n";
					break;
				}
				hnum=1;
				sum=sum*10+a[i].s2[j]-'0';
				if(pd==0 || pd==1 || pd==2 || pd==3)
					if(sum<0 || sum>255){
						w=0;
						cout<<"ERR\n";
						break;
					}
				if(pd==4)
					if(sum<0 || sum>65535){
						w=0;
						cout<<"ERR\n";
						break;
					}
				if(pd>4){
					w=0;
					cout<<"ERR\n";
					break;
				}
				tpd=0;
			}
		}
		if(w==0) continue;
		if(pd<4 || !hnum){
			w=0;
			cout<<"ERR\n";
			continue;
		}
		if(a[i].s1=="Server"){
			if(pd1[t]){
				cout<<"FAIL\n";
				continue;
			}
			else{
				cout<<"OK\n";
				pd1[t]=1;
				pd2[t]=i;
			}
		}
		else{
			if(pd1[t]) cout<<pd2[t]<<"\n";
			else cout<<"FAIL\n";
		}
	}
	return 0;
}

此时,机房旁边一位大哥因斗地主而愁眉苦脸。


【题解】P7912 [CSP-J 2021] 小熊的果篮

建议用链表或set写:
尤其是set

如果会使用如上的任意一种数据结构,就能AC。

如果不了解,我写什么也没什么必要吧···

AC code 不放了,祝大家AC这道氵绿题。

推荐代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,a[N];
set<int> st[2];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i),
		st[a[i]].insert(i);
	st[0].insert(1e9);
	st[1].insert(1e9);
	while(*st[0].begin()!=1e9||*st[1].begin()!=1e9){
		int now=min(*st[0].begin(),*st[1].begin());
		for(;now!=1e9;now=*st[a[now]^1].lower_bound(now)){
			printf("%d ",now);
			st[a[now]].erase(now);
		}
		puts("");
	}
	return 0;
}//by shy
  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2021csp-j初赛PDF是指2021年计算机科学与技术竞赛初赛的题目和相关资料以PDF形式呈现。初赛通常是为了选拔出具有一定水平的选手进入到决赛中,这是一项对计算机技术知识和能力的测试和评估活动。 2021csp-j初赛PDF中的题目包含了多个具备挑战性的计算机科学和编程问题,如算法设计、数据结构、编程语言等方面。参与者需要经过分析题目需求,设计算法和编写代码来解决问题。PDF中还可能包含参考答案和详细的解题思路,供考生参考和学习。 参与2021csp-j初赛PDF的竞赛对于学习者来说具有很大的意义。通过分析和解决这些具有一定难度的计算机科学问题,可以提高自己的编程技术和算法设计能力。同时,这也是一种综合应用理论知识的机会,让学生将所学知识运用到实际问题中去。 这份初赛PDF还具有一定的参考价值。无论是对于参赛者还是其他学习者来说,这些题目都是一种很好的学习资源。可以通过研究解答思路和代码实现,从中学到新的算法和编程技巧。同时通过与他人的交流和讨论,也可以加深对计算机科学和编程的理解。 总之,2021csp-j初赛PDF提供了一个学习和竞技的平台,通过解决题目来提高计算机科学和编程技能。无论是参与竞赛还是作为学习资源,它都是一个宝贵的资料。希望参与者和学习者都能够充分利用这个资源,不断提升自己在计算机领域的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值