CSP - J 2021 题目解析

diary

1、马上就要月考了,期末考也近在眼前,心中慌成DOG,却还在游手好闲,是时候调整一下了
2、总结出了学习规律

要尊重他人,想说的话要用纸条来传达
在从别人那里获取了利益之前,要先展示出你的价值

Next,让我们进入今天的正题

CSP - J - 1 分糖果

刚开始一看,感觉很简单,然后就想了好久。。。。

题意简述:

给你三个数 \(n,l,r\),让你在 \([l,r]\) 中找到一个整数 \(x\),使 \(n\) \(mod\) \(x\) 最大,输出这个最大的 \(n\) \(mod\) \(x\)

这题可以用多个方面去分析

我们当然选择最简单的

可以知道

①若 \(l\)\(r\)之间的长度\((r-l+1) ≥ n\),就一定有一个\(x\)使得 \(n\) \(mod\) \(x=n-1\) (不会的可以手动模拟一下)
②若 \(l\)\(r\)之间的长度\((r-l+1) < n\) 再次进行分类讨论
\(l\) \(mod\) \(n\) \(≤\) \(r\) \(mod\) \(n\) (注意是小于等于,因为当l==r也合适这个图)
如图

此时能取到的数的范围为上图的红色部分,这时答案为 \(r\) \(mod\) \(n\)

\(l\) \(mod\) \(n\) \(>\) \(r\) \(mod\) \(n\)

此时能取到的数的范围为上图的红色部分,这时答案为 \(n-1\)

上代码

#include<cstdio>
using namespace std;
int n,L,R;
int main(){
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	scanf("%d%d%d",&n,&L,&R);
	if(R-L+1>=n)printf("%d\n",n-1);
	else{
		if(L%n<=R%n)printf("%d\n",R%n);
		else printf("%d\n",n-1);
	}
	return 0;
}

CSP - J - 2 插入排序

题意简述:

给定长度为 \(n\) 的序列 \(a_i\)
现在要维护单点修改与冒泡排序后一元素的下标。

分析一下

记录一下原来的位置,从修改的位置开始,若修改值\(v\)比原来大,向后冒泡排序
否则向左

上代码

#include  <bits/stdc++.h>

#define N 8005 
#define LL long long

using namespace std;

int n,q;
struct node{
	int date;
	LL num;
}a[N];
LL x;
int temp;
LL sss; 


int main(){
	scanf("%d%d",&n,&q);
	for (int i=1;i<=n;i++){
		scanf("%lld",&x);
		a[i].num=x;
		a[i].date=i;
	}
	for (int i=1;i<=n;i++){
		for (int j=i;j>=2;j--)
			if (a[j].num < a[j-1].num)
				swap(a[j],a[j-1]);
	}
	for (int l=1;l<=q;l++){
		int opt;int root;
		scanf("%d",&opt); 
		if (opt==1){
			scanf("%d%lld",&temp,&sss);
			for (int i=1;i<=n;i++){
				if (a[i].date==temp)
					root=i;
			}
			if (sss>a[root].num){
				a[root].num=sss;
				for (int i=root;i<n;i++)
					if (a[i].num>a[i+1].num){
						swap(a[i],a[i+1]);
					}else if (a[i].num==a[i+1].num&&a[i].date>a[i+1].date){
						swap(a[i],a[i+1]);
					}else break;
			}else if (sss<a[root].num){
				a[root].num=sss;
				for (int i=root;i>1;i--)
					if (a[i].num<a[i-1].num){
						swap(a[i],a[i-1]);
					}else if (a[i].num==a[i-1].num&&a[i-1].date>a[i].date){
						swap(a[i],a[i-1]);
					}else break;
			}
		}else {
			scanf("%d",&temp);
			for (int i=1;i<=n;i++)
				if (a[i].date==temp){
					printf("%d\n",i);
					break;
				}
		}
	}
	
	return 0;
}

CSP - J - 3 网络连接

本人也不会缩行
一手大模拟上

#include <bits/stdc++.h>
using namespace std;

int opt,n,h=0;
string s;
char c;
struct node{
	int a,b,c,d,e;
	int date;
}e[1005];


int main(){
	scanf("%d",&n);
	for (int l=1;l<=n;l++){
		cin>>s;
		if (s == "Server")
			opt=1;
		else opt=2;
		int num[15]={0},x=0,flag=1;
		bool mh=false;
		bool boom=false,zero=false,ss=false,www=false;
		c=getchar();
		while(1){
			c=getchar();
			if ('0'<=c&&c<='9'){
				if (zero==true){
					boom=true;
					break;
				}
				if (x==0&&c=='0')
					zero=true;
				x=x*10+c-'0';
				ss=true;
			}else if (c=='.'){
				if (flag>4){
					boom=true;break;
				}if (!ss){
					boom=true;break;
				}
				num[flag]=x;
				flag++;
				zero=false;
				ss=false;
				x=0;
			}else if (c==':'){
				if (mh){
					boom=true;break;
				}if (!ss){
					boom=true;break;
				}num[flag]=x;
				if (flag!=4){
					boom=true;
					break;
				}flag++;
				x=0;
				zero=false;
				ss=false;
				mh=true;
			}else if (c=='\n'){
				if (!mh){
					boom=true;
					break;
				}
				num[flag]=x;
				if (!(num[1]<=255&&num[2]<=255&&num[3]<=255&&num[4]<=255&&num[5]<=65535)){
					boom=true;
					break;
				}
				
				if (opt==1){
					for (int i=1;i<=h;i++){
						if (e[i].a==num[1]&&e[i].b==num[2]&&e[i].c==num[3]&&e[i].d==num[4]&&e[i].e==num[5]){
							printf("FAIL\n");
							www=true;
							break;
						}
					}
					if (!www){
						h++;
						e[h].a=num[1];e[h].b=num[2];e[h].c=num[3];e[h].d=num[4];e[h].e=num[5];
						e[h].date=l;
						printf("OK\n");
					}
				}else if (opt==2){
					for (int i=1;i<=h;i++){
						if (e[i].a==num[1]&&e[i].b==num[2]&&e[i].c==num[3]&&e[i].d==num[4]&&e[i].e==num[5]){
							printf("%d\n",e[i].date);
							www=true;
							break;
						}
					}if (!www)
						printf("FAIL\n");
				}
				
				break;
				
				
			}else{
				boom=true;
				break;
			}
		}
		if (boom){
			printf("ERR\n");
			while (1){
				if (c!='\n')
					c=getchar();
				else 
					break;
			}
		}
			
			
	}
				
	return 0;
}

CSP - J - 4 小熊的果篮

挖一个宇宙级别的天坑

posted @ 2021-12-05 15:38  hewt  阅读(234)  评论(0编辑  收藏  举报