CCF-CSP | 2019-12第18次认证考试记录

总结

分数比较低,但是也过了给自己定的过前两题的目标。考试的时候比较紧张,感觉键盘很难用,而且平常一直看不懂编译日志,在考试中也比较手忙脚乱。第三题其实已经写了一大半了,但是时间不够了。总的来说自己还是太垃圾了,但应该比几个月前的自己要强不少。之前荒废的时间太多了,希望自己寒假能认真刷题吧。
还有一点经验是,考完试之后是可以下载答卷的,所以我当时应该把写了一大半的第3题交上去,不然回来想做出来还要重新开始写。
CCF-CSP | 2019-12第18次认证考试记录_第1张图片

前两道题目代码

第1题

题目回忆

大体是说四个人报数,遇到7的倍数以及含7的数字就跳过,输入四个人总共报的数字个数(跳过的数字不含在内),输出四个人每个人跳过的次数。

代码

#include
#include
using namespace std;

int main()
{
	int n;
	int cnt=0;
	int j=0;
	int y=0;
	int b=0;
	int d=0;
	int i=1;
	cin>>n;
	while(cnt<n)
	{
		if(((i%7)==0)||((i%10)==7)||((i%100/10)==7)
		||((i%1000/100)==7))
		{
			if(i%4==0) 
			{
				d++;
				//cout<<"丁跳过"<
			} 
			
			else if(i%4==1) 
			{
				j++;
				//cout<<"甲跳过"<
			}
			else if(i%4==2) 
			{
				y++;
				//cout<<"乙跳过"<
			}
			else if(i%4==3) 
			{
				b++;
				//cout<<"丙跳过"<
				
			}
			i++;
		
		}
		else
		{
			i++;
			cnt++;
		}
	}
	
	cout<<j<<endl<<y<<endl<<b<<endl<<d<<endl;
    
    return 0;	
}

反思

题目很简单,但是我犯了一个从小时候玩报数就会犯的低级错误,“含7的数字”只考虑个位带7的,忘掉十位、百位等等带7的,少写了两个判断条件,所以一开始第二个样例没有跑通。

第2题

题目回忆

大体是说给你一堆点的坐标,让你从中选点。需要满足这个点有垃圾,并且它的上下左右都有垃圾。输入是点的个数和这些点的坐标,输出是计算在这些候选点中评分为0、1、2、3 、4的点的个数。评分这样计算:左上角,左下角,右上角、右下角几处有垃圾就算几分。

代码

#include
#include
#include
using namespace std;
const int N = 1e3+5;
struct point
{
	long long x;
	long long y;
};
int count1(int *y,int t)
{
	int cnt = 0;
	for(int i=0;i<t;i++)
	{
		if(y[i]==1) cnt++;
	}
	return cnt;
} 

struct point a[N]; 
int main()
{
   int n;
   int s0=0;
   int s1=0;
   int s2=0;
   int s3=0;
   int s4=0;
   cin>>n;
   
   for(int i=0;i<n;i++) 
   { 
        
        int x,y;
   	    cin>>x>>y;
   	    a[i].x = x;
   	    a[i].y = y;   
   }

   for(int i=0;i<n;i++) //对每个坐标 
   {
   	    int flag[4];for(int j = 0;j<4;j++) flag[j]=0 ;
        int tag[4]; for(int j = 0;j<4;j++) tag[j]=0 ;
   	    for(int j=0;j<n;j++)
   	    {
   	        if((a[j].y==a[i].y-1)&&(a[j].x==a[i].x)) 
			   {
			   	    flag[0]=1;
			   	    continue;
			   }	
		    if((a[j].y==a[i].y+1)&&(a[j].x==a[i].x)) 
			{
				flag[1]=1;
				continue;
			}
		    if((a[j].y==a[i].y)&&(a[j].x==a[i].x-1)) 
			{
				flag[2]=1;
				continue;
			}
		    if((a[j].y==a[i].y)&&(a[j].x==a[i].x+1)) 
			{
				flag[3]=1;
				continue;
			}
       }
       //cout<
       if(count1(flag,4)==4)
       {
       	for(int j=0;j<n;j++)
	    {
	        
	        {
	   	        if((a[j].y==a[i].y-1)&&(a[j].x==a[i].x-1))  
				   {
				   	  tag[0]=1;
				   	  continue;
				   }
		      	if((a[j].y==a[i].y+1)&&(a[j].x==a[i].x-1)) 
				  {
				  	 tag[1]=1;
				  	 continue;
				  }
		        if((a[j].y==a[i].y-1)&&(a[j].x==a[i].x+1)) 
				{
					tag[2]=1;
					continue;
				}
		        if((a[j].y==a[i].y+1)&&(a[j].x==a[i].x+1)) 
				{
					tag[3]=1;
					continue;
				}	
	        }
        }
        if(count1(tag,4)==4) s4++;
		        else if(count1(tag,4)==3) s3++;
		        else if(count1(tag,4)==2) s2++;
		        else if(count1(tag,4)==1) s1++;
		        else if(count1(tag,4)==0) s0++; 
	   }
	   //cout<
    }
   printf("%d\n%d\n%d\n%d\n%d",s0,s1,s2,s3,s4);
   return 0;	
}

反思

这份代码写的。。还挺烂的。这个题稍微绕一点的地方在于给的这些点的坐标范围是正负1e9。所以,按照我一开始的思路是开了一个大数组来标记这些点有没有垃圾,但是开不了那么大(C学的不好,等会去查一下原因)。然后就用了比较笨的办法。
结构体数组用来表示每个点坐标,没有想到什么好的办法可以给结构体一个按顺序的索引,只能遍历查找某点八个方向上的邻居点。方法挺差的,写的时候体验感也很差。

你可能感兴趣的:(刷题)