2021 CSP 赛后反思

本文包含三个编程问题的解决方案:CANDY问题通过数论简单计算求解;SORT问题涉及数据排序与重排名;NETWORK问题模拟IP地址查询。FRUIT问题用数组模拟水果分配。代码实现分别针对每种问题,但复杂度和效率各不相同。
摘要由CSDN通过智能技术生成

文章目录

CANDY

普及- 难度。。。
数论推一下即可。。。
代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	//freopen("candy.in","r",stdin);
	//freopen("candy.out","w",stdout);
	int n,l,r;
	scanf("%d%d%d",&n,&l,&r);
	int v=l%n;
	if(r-l+v<n) printf("%d",r-l+v);
	else printf("%d",n-1);
	return 0;
}

SORT

思路:先记录每个数据的排名,因为调换的次数较少,所以在一操作中进行重排名。将处在原、现数字中的排名加或减1,在处理相同数字的情况。(可惜我没能写出找a[x]的排名的方法,只能写排序了
小数据能过,大数据会超时。。。

#include<bits/stdc++.h>
using namespace std;
struct num{
	int s;
	int k;
	int p;
};
bool f1(num x,num y){
	if(x.s<y.s) return 1;
	else return 0;
}
bool f2(num x,num y){
	if(x.k<y.k) return 1;
	else return 0;
}
int main(){
	//freopen("sort.in","r",stdin);
	//freopen("sort.out","w",stdout);
	int n,q;
	scanf("%d%d",&n,&q);
	num a[n+1];
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i].s);
		a[i].k=i;
	}
	sort(a+1,a+1+n,f1);
	for(int i=1;i<=n;i++){
		a[i].p=i;
	}
	sort(a+1,a+n+1,f2);
	for(int i=1;i<=q;i++){
		int d;
		scanf("%d",&d);
		if(d==1){
			int x,v;
			scanf("%d%d",&x,&v);
			a[x].s=v;
		}
		else{
			int x;
			sort(a+1,a+1+n,f1);
			for(int i=1;i<=n;i++){
				a[i].p=i;
			}
			sort(a+1,a+n+1,f2);
			scanf("%d",&x);
			printf("%d\n",a[x].p);
		}
	}
	return 0;
}

NETWORK

时间来不及了,写的骗分,估摸着二十个数据点能过八个。。。

#include<bits/stdc++.h>
using namespace std;
int cs[1000000];
int main(){
	//freopen("network.in","r",stdin);
	//freopen("network.out","w",stdout);
	memset(cs,0,sizeof(cs));
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		char g[20];
		scanf("%s",g);
		int a,b,c,d,e;
		scanf("%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
		if(g[0]=='S'){
			cs[a+b*2-c+231*d+e*4]=i;
			cout<<"OK"<<endl;
		}
		else{
			if(cs[a+b*2-c+231*d+e*4]!=0){
				cout<<cs[a+b*2-c+231*d+e*4]<<endl;
			}
			else cout<<"FAIL"<<endl;
		}
	}
	return 0;
}

后来想的思路就是a,b,c,d,e都用字符串转数字来判断域名错误的情况。

FRUIT

用数组记录每个水果的存在情况,模拟。

#include<bits/stdc++.h>
using namespace std;
int main(){
	//freopen("fruit.in","r",stdin);
	//freopen("fruit.out","w",stdout);
	int n;
	scanf("%d",&n);
	int a[n+1];
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int t=0;
	bool f[n+1];
	memset(f,0,sizeof(f));
	while(t<n){
		int u=-1;
		for(int i=1;i<=n;i++){
			if(u!=a[i]&&f[i]==0){
				printf("%d ",i);
				u=a[i];
				a[i]=-1;
				f[i]=1;
				t++;
			}
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值