2019年度CSP复赛记

考前准备

考前的时候一直在复习以前打过的题目,每周五晚集训,训练一套难度差不多为提高的练习。

考前一周

文化课的期中考试,考的不是很好,才排到了班第四(一个级一共 20 20 个班),然而出乎意料的是,级排居然是第 49 49 名。

考前一天

又是做大巴去考试……一路上都在闲聊,有时聊一下成绩,有时开一下玩笑。更加出乎意料的是,居然有一个机房里的同学更我一样的成绩,一样的排名(指文化课)。一到酒店,就冲凉,然后拍了一个 S T ST 的模板,然后睡觉……

考前半天

一直在宿舍里玩和复习,不得不说的是广州的饭菜真好吃,难忘的早餐和午餐。

考前一小时

在中山纪念馆里照相,然后在考试机房门口等待考试。被文化课的考试折磨惯了,一点也不紧张……

考场策略

一拿到题目,发现第 1 1 题好水啊!立马看其他三题,发现第 2 2 题还好,但是后两题好难啊!!!所以五分钟打完了第一题,然后三十分钟打完了第二题,又大约二十五分钟调试对了第二题。然后就一直循环:第三题想不出正解,换第四题第四题想不出正解,换第三题。这个循环大概持续了一小时,突然发现没什么时间了,立马开始骗分!当然今年的骗分不同去年的骗分,今年的骗分运用了一种叫分段骗分的方法。

考后三小时

自估分为 280 280 分。然后与同学分享了自己的解法,分享同学们各显神通,除了第一题都一样之外,每个人对自己剩下三题的把握各有不同。我们把自己的情况与老师分享,老师表示:“第一题好难啊,我都没听过”嗨……可想而知今年的题目对于我们有多难……根据同学们的反应,我们去KFC吃了晚餐。

考后一天至出成绩前一天

回归正常的生活,一直没想 C S P CSP 的事,直到出成绩前一天,大家忽然沸腾,讨论出成绩没,出成绩没……

出成绩

成绩出来的那一天,我查询了自己的成绩, 285 285 分,与自估分无过大出入。问了问同学们,发现自己的成绩好像是全班最高的……

各题原代码

【第一题】:

#include <bits/stdc++.h>
using namespace std;
string s;int ans;
int main(){
	cin>>s;
	for(int i=0;i<8;i++)
		if (s[i]=='1')
			ans++;
	printf("%d",ans);
	return 0;
}

时间复杂度: O ( 1 ) O(1) ,得分 100 100 分。

扫描二维码关注公众号,回复: 8833910 查看本文章

【第二题】:

#include <bits/stdc++.h>
using namespace std;
#define gc getchar()
#define g(c) isdigit(c)
inline int read(){
	char c=0;int x=0;bool f=0;
	while (!g(c)) f=c=='-',c=gc;
	while (g(c)) x=x*10+c-48,c=gc;
	return f?-x:x;
}
const int N=100100;
struct node{
	int price,times;
	bool used;
}q[N];int head,tail,n;
int way[N],price[N],times[N];
inline void read_the_date(){
	n=read();
	for(int i=1;i<=n;i++){
		way[i]=read();
		price[i]=read();
		times[i]=read();
	}
}
long long answer;
inline void calc_answer(){
	head=1;tail=0;
	for(int i=1;i<=n;i++){
		if (way[i]==0){
			answer+=price[i];
			q[++tail].price=price[i];
			q[tail].times=times[i];
			q[tail].used=true;
		}
		else{
			while (head<=tail&&q[head].times<times[i]-45) head++;
			register bool flag=true;
			for(int j=head;j<=tail;j++)
				if (q[j].used&&q[j].price>=price[i]){
					q[j].used=false;
					flag=false;break;
				}
			if (flag) answer+=price[i];
		}
	}
}
inline int HPXXZYY(){
	read_the_date();
	calc_answer();
	cout<<answer;
	return 0;
}
int main(){
	return HPXXZYY();
}

时间复杂度:最好 O ( n ) O(n) ,最坏 O ( 45 × n ) O(45 \times n) ,得分 100 100 分。

【第三题】:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,t,dp[1100];
int a[110][110];
int main(){
//	freopen("souvenir.in","r",stdin);
//	freopen("souvenir.out","w",stdout);
	scanf("%d%d%d",&t,&n,&m);
	for(int i=1;i<=t;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	if (t==1) printf("%d",m);
	else if (n==1){
		dp[0]=m;
		for(int i=1;i<=t;i++){
			dp[i]=dp[i-1];
			for(int j=1;j<i;j++){
				dp[i]=max(dp[i],dp[j-1]/a[j][1]*a[i][1]+dp[j-1]%a[j][1]);
			}
		}
		printf("%d",dp[t]);
	}
	else if (t==2){
		for(int i=1;i<=n;i++)
			for(int j=a[1][i];j<=m;j++)
				dp[j]=max(dp[j-a[1][i]]+a[2][i],dp[j]);
		printf("%d",dp[m]);
	}
	else printf("9983");
	return 0;
}

时间复杂度: O ( 1 ) O ( n × m ) O(1)-O(n \times m) ,得分 25 25 分。

【第四题】:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool b[2010][2010];
struct node{
	int next,to;
}e[200100];int h[100100],tot;
inline void add(int a,int b){
	e[++tot]=(node){h[a],b};h[a]=tot;
	e[++tot]=(node){h[b],a};h[b]=tot;
}
bool f[1010][1010];
inline bool check(int s,int L){
	if (s==1&&L==0) return true;
	if (f[s][L]==false) return false;
	if (L==0) return f[s][L]=false;
	if (s==1&&L==1) return false;
	for(int i=h[s];i;i=e[i].next){
		register int to=e[i].to;
		if (check(to,L-1))
			return true;
	}
	return f[s][L]=false;
}
int n,m,q,u,v,L;
int main(){
//	freopen("work.in","r",stdin);
//	freopen("work.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
		b[u][v]=b[v][u]=true;
	}
	for(int i=1;i<=q;i++){
		scanf("%d%d",&u,&L);
		if (L==1){
			if (b[u][1]) printf("Yes\n");
			else printf("No\n");
		}
		else{
			memset(f,true,sizeof(f));
			if (check(u,L)) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

时间复杂度: O ( O( 我不知道 ) ) ,得分 60 60 分。

期望

2020 2020 年可能就考提高了,祝普及可以 A C AC 前两题,第三题拿个 60 60 分,第四题拿个 70 70 分这样吧。提高的话,两天共 400 400 吧。加油,不甘落后的你一定可以的!!!

发布了82 篇原创文章 · 获赞 4 · 访问量 1780

猜你喜欢

转载自blog.csdn.net/ZHUYINGYE_123456/article/details/103432905