第十八次CSP认证总结

我的第一次CSP认证,期望考到200分。
题目一年比一年难…之前往年的题目也就做了前两题,没有认真研究后面三个题,太浮躁了。

2019-12-15 青岛大学
前两个水题切了一个小时,之前的最多40分钟,把题目理解清楚就ok了。
第三题判断化学方程式是否配平(包括系数、化学元素(大小写)、括号、嵌套括号),读题的时候想的太少,没考虑清楚,导致最后写了2个半小时才发现没想全…再给我1小时差不多可以过6组样例的,下次再做大模拟的想明白了再下手,在纸上要写明白,要不写的时候容易掉了条件,我太难了…
第四题区块链,没看懂,过后补题,没做。
第五题,区间操作,暴力做的,longlong开的无符号整型。

2019-12-17
出分了 … 240 (前7.1%),差不多跟预想的一样
1:100
2:100
3:30
4:0
5:10

明年3月份继续吧,这次做题有点浮躁,沉不下心来,还是菜啊…
考一次有点贵,400块钱(包括路费)…学校好像对这个不重视,没法报销。
附上比赛的代码:

1.报数(100分)

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef long long ll;
const int maxn=1e6+10;
using namespace std;
ll a[maxn];
ll judge(int n)
{
	if(n%7==0)
		return 1;
	ll num=log10(n)+1;
	ll ans=n;
	for(int i=1;i<=num;i++)
	{
		if(ans%10==7)
			return 1;
		ans/=10;
	}
	return 0;
}
void init()
{
	ll k=1;
	for(int i=1;i<=10000;i++)
	{
		if(judge(i)==0)
			a[k++]=i;
	}
}
int main()
{
	ll n;
	ll a1=0,a2=0,a3=0,a4=0;
	cin>>n;
	init();
	ll num=a[n];
	for(int i=1;i<=num;i+=4)//1
	{
		if(judge(i)==1)
			a1++;
	} 
	for(int i=2;i<=num;i+=4)//2
	{
		if(judge(i)==1)
			a2++;
	} 
	for(int i=3;i<=num;i+=4)//3
	{
		if(judge(i)==1)
			a3++;
	} 
	for(int i=4;i<=num;i+=4)//4
	{
		if(judge(i)==1)
			a4++;
	} 
	cout<<a1<<endl<<a2<<endl<<a3<<endl<<a4<<endl;
	
	return 0;
}

2.回收站选址 (100分)

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef long long ll;
const int maxn=1e6+10;
using namespace std;
struct node{
	ll x,y;
}eg[maxn];
ll a[10];
int main()
{
	ll u,d,l,r,num;
	ll n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>eg[i].x>>eg[i].y;
	}
	for(int i=1;i<=n;i++)
	{
		u=0,d=0,l=0,r=0;
		num=0;
		ll x=eg[i].x;
		ll y=eg[i].y;
		for(int j=1;j<=n;j++)
		{
			
			if(eg[j].x==x&&eg[j].y==y+1)
				u=1;
			else if(eg[j].x==x&&eg[j].y==y-1)
				d=1;
			else if(eg[j].x==x-1&&eg[j].y==y)
				l=1;
			else if(eg[j].x==x+1&&eg[j].y==y)
				r=1;
		
		}
		if(u==1&&d==1&&l==1&&r==1)
		{
			for(int j=1;j<=n;j++)
			{
				if(eg[j].x==x-1&&eg[j].y==y+1)
					num++;
				else if(eg[j].x==x-1&&eg[j].y==y-1)
					num++;
				else if(eg[j].x==x+1&&eg[j].y==y+1)
					num++;
				else if(eg[j].x==x+1&&eg[j].y==y-1)
					num++;	
			}
			a[num]++; 
		}
	}
	for(int i=0;i<=4;i++)
	{
		cout<<a[i]<<endl;
	}
	return 0;
}

3.化学方程式 (30分)

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef long long ll;
const int maxn=1e6+10;
using namespace std;
ll pre[1000],hre[1000];
ll s[1000],h[1000];
void init()
{
	for(int i=0;i<1000;i++)
	{
		pre[i]=0;
		hre[i]=0;
		s[i]=0;
		h[i]=0;
	}
}
int main()
{
	ll n,k;
	cin>>n;
	string str;
	for(int i=1;i<=n;i++)
	{
		init();
		ll flag=0;
		cin>>str;
		for(int j=0;j<str.length();j++)
		{
			if(str[j]=='=')
				k=j;	
		}	
		//cout<<"k "<<endl;
		ll o1=0;
		for(int i=0;i<k;i++)
		{
			if(str[i]=='+')
				s[o1++]=i;
		}
	//	cout<<"o1 "<<o1<<endl;
		ll o2=0;
		for(int i=k+1;i<str.length();i++)
		{
			if(str[i]=='+')
				h[o2++]=i;
		}
		ll qq;
		if(s[0]==0)
			qq=k;
		else
			qq=s[0];
		ll f1=0;//第一部分 
		if(str[0]>='0'&&str[0]<='9')
			f1=1;
		if(f1)
		{
			ll mm;
			ll num=str[0]-'0';
			for(int i=1;i<qq;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
				if(str[i+1]>='0'&&str[i+1]<='9')
				{
					mm=str[i+1]-'0';
					
				}	
				
				pre[str[i]-'A']+=num*mm;
			}
		}
		else
		{
			ll mm;
			for(int i=0;i<qq;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
						//cout<<mm<<endl; 
						
					}	
				//cout<<str[i]<<endl;
				pre[str[i]-'A']+=mm;
			}
		}
	  
	   for(int i=0;i<o1-1;i++)//中间 
	   {
	   	    ll l=s[i]+1,r=s[i+1];
	   		ll f=0;
			if(str[l]>='0'&&str[l]<='9')
				f=1;
			if(f)
			{
				ll mm;
				ll num=str[l]-'0';
				for(int i=l+1;i<r;i++)
				{
					mm=1;
					if(str[i]>='0'&&str[i]<='9')
						continue;
					
						if(str[i+1]>='0'&&str[i+1]<='9')
						{
							mm=str[i+1]-'0';
							
						}	
					
					pre[str[i]-'A']+=num*mm;
				}
			}
			else
			{
				ll mm;
				for(int i=l;i<r;i++)
				{
					mm=1;
					if(str[i]>='0'&&str[i]<='9')
						continue;
					
						if(str[i+1]>='0'&&str[i+1]<='9')
						{
							mm=str[i+1]-'0';
						
						}	
					
					pre[str[i]-'A']+=mm;
				}
			}
	   }
	   if(s[0])
	   {
	   
		f1=0;//后面 
		if(str[s[o1-1]+1]>='0'&&str[s[o1-1]+1]<='9')
			f1=1;
		if(f1)
		{
			ll mm;
			ll num=str[s[o1-1]+1]-'0';
			for(int i=s[o1-1]+2;i<k;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
					
					}	
				
				pre[str[i]-'A']+=num*mm;
			}
		}
		else
		{
			ll mm;
			for(int i=s[o1-1]+1;i<k;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
						
					}	
				
				pre[str[i]-'A']+=mm;
			}
		}	
	   }
		//==HOU
		ll pp;
		if(h[0]==0)
			 pp=str.length();
		else
			pp=h[0];
		f1=0;//第一部分 
		if(str[k+1]>='0'&&str[k+1]<='9')
			f1=1;
		if(f1)
		{
			ll mm;
			ll num=str[k+1]-'0';
			for(int i=k+2;i<pp;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
						
					}	
				
				hre[str[i]-'A']+=num*mm;
			}
		}
		else
		{
			ll mm;
			for(int i=k+1;i<pp;i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
					
					}	
				
				hre[str[i]-'A']+=mm;
			}
		}
	  
	   for(int i=0;i<o2-1;i++)//中间 
	   {
	   	    ll l=h[i]+1,r=h[i+1];
	   		ll f=0;
			if(str[l]>='0'&&str[l]<='9')
				f=1;
			if(f)
			{
				ll mm;
				ll num=str[l]-'0';
				for(int i=l+1;i<r;i++)
				{
					mm=1;
					if(str[i]>='0'&&str[i]<='9')
						continue;
					
						if(str[i+1]>='0'&&str[i+1]<='9')
						{
							mm=str[i+1]-'0';
							
						}	
					
					hre[str[i]-'A']+=num*mm;
				}
			}
			else
			{
				ll mm;
				for(int i=l;i<r;i++)
				{
					mm=1;
					if(str[i]>='0'&&str[i]<='9')
						continue;
				
						if(str[i+1]>='0'&&str[i+1]<='9')
						{
							mm=str[i+1]-'0';
						
						}	
					
					hre[str[i]-'A']+=mm;
				}
			}
	   }
		if(h[0])
		{
		f1=0;//后面 
		if(str[h[o2-1]+1]>='0'&&str[h[o2-1]+1]<='9')
			f1=1;
		if(f1)
		{
			ll mm;
			ll num=str[h[o2-1]+1]-'0';
			for(int i=h[o2-1]+2;i<str.length();i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
					
					}	
				
				hre[str[i]-'A']+=num*mm;
			}
		}
		else
		{
			ll mm;
			for(int i=h[o2-1]+1;i<str.length();i++)
			{
				mm=1;
				if(str[i]>='0'&&str[i]<='9')
					continue;
				
					if(str[i+1]>='0'&&str[i+1]<='9')
					{
						mm=str[i+1]-'0';
						
					}	
				
				hre[str[i]-'A']+=mm;
			}
		}
		}
		
		for(int i=0;i<500;i++)
		{
			if(pre[i]!=hre[i])
				flag=1;
		}
		if(flag)
			cout<<"N"<<endl;
		else
			cout<<"Y"<<endl;
		
	}	
		 
	return 0;
}

5.魔数 (10分)

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef unsigned long long ll;
const int maxn=1e6+10;
using namespace std;
ll a[maxn];
ll u[10];
ll n;
const ll mod1=2009731336725594113;
const ll mod2=2019;
void init(ll n)
{
	for(int i=1;i<=n;i++)
	{
		a[i]=i;
	}
}
int main()
{
	ll q;
	u[0]=314882150829468584;
	u[1]=427197303358170108;
	u[2]=1022292690726729920;
	u[3]=1698479428772363217;
	u[4]=2006101093849356424;
	cin>>n>>q;
	init(n);
	ll num;
	ll l,r,t;
	for(int i=1;i<=q;i++)
	{
		num=0;
		cin>>l>>r;
		for(int j=l;j<=r;j++)
		{
			num+=(a[j]%mod1)%mod2;
		}
		cout<<num<<endl;
		t=num%5;
		for(int j=l;j<=r;j++)
		{
			a[j]=((a[j]%mod1*u[t]%mod1)%mod1)%mod2;
		}
	}
		 
	return 0;
}
发布了88 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43667611/article/details/103573907