NKOJ 0613挑战赛总结

题目A:【语法基础】三角塔

给出如下图的三角塔,每一层都由若干同样的正方体构成:

 设塔高为 N,请你编程计算N层塔的砖块数量总和。

输入格式

只有一个整数 N ,表示三角塔的层数。

输出格式

 只有一个整数,表示砖块的总数量

 样例输入

5

样例输出

35 

提示

 0 <= N <= 1000

这道题比较简单,找规律就行了,不做赘述

关键代码

	for(int i=1;i<=n;i++){
		ans+=i*(n-i+1);
	}

题目B:修改数字

何老板有n个小球,每个小球上都有一个数字,第i个小球上的数字为a_i{}

何老板想要修改一些小球上的数字,使得最多有k个不同数字出现在小球上。

问,最少需要修改几个小球上的数字

输入格式

第一行,两个整数n,k

第二行,n个整数,a_1{},a_2{} ... a_n{}

1\leq k\leq n\leq 200000,1\leq a_i{}\leq n

输出格式

输出一个整数答案

样例输入

5 2
1 1 2 2 5

样例输出

1

 这道题我的思路就是用一个同数组记录数字出现的次数次,在用另一个数组把个数存起来在进行排序,把出现次数少的优先修改

关键代码

	for(int i=1;i<=max;i++){
		if(a[i]!=0){
		b[++j]=a[i];	
		}
	} 

题目C 移动骑士

问题描述

网格状棋盘上有一骑士,每一步,骑士可按照下列方式移动。

 现在告诉你起点和终点,问将骑士从起点移动到终点,最少需要多少步?

输入格式

第一行,一个整数n,表示有一个n*n的棋盘。(4<=n<=1000)
第二行,两个整数,表示起点的坐标x1,y1
第三行,两个整数,表示终点的坐标x2,y2
(0<=x1,y1,x2,y2<=n-1)

输出格式

一个整数,表示最小的步数

样例输入

100
0 0
30 50

样例输出

28

 这道题的思路就是宽搜把到每个点的步数都求出来,不应该的就是宽搜写了几遍才AC,耽误了后面几道题的时间,宽搜不太熟练,应多加练习

重点代码

void bfs(int x,int y)
{
	q.push((zb){x,y,0});
	a[x][y]=0;
	book[x][y]=1;
	while(!q.empty())
	{
		zb t=q.front();
		q.pop();
		
		for(int i=0;i<8;i++)
		{
			int xx=t.x+dx[i];
			int yy=t.y+dy[i];
			if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]==0&&book[xx][yy]==0){
			a[xx][yy]=t.bs+1;
			book[xx][yy]=1;
//			cout<<xx<<" "<<yy<<endl;
			q.push((zb){xx,yy,t.bs+1});				
			}

		}
	}
}

 题目D 数糖纸

问题描述

果老师喜欢数糖纸,不同的糖纸有不同的颜色,一共有 N 张糖纸,第 i 张糖纸颜色为 Ci ,它们的位置都是固定的。果老师喜欢五彩缤纷的糖纸,所以他不希望有重复的颜色。他有一次机会,可以收集任意一段连续区间内的糖纸,并且不包含重复颜色的糖纸。求出果老师最多能收集多少张糖纸。

输入格式

第一行一个正整数 N ,表示共有 N 张糖纸。

第二行共有 N 个正整数,第 i 个正整数表示第 i 张糖纸的颜色 Ci

对于20%的数据:1\leq N \leq 100

对于40%的数据:1\leq N \leq 1000

对于100%的数据:1\leq N \leq 10^{6},0\leq c_i{}\leq10^{9}

输出格式

一个整数表示果老师最多能收集多少张糖纸。

样例输入

5
1 2 2 3 4

 样例输出

3

 提示

果老师可以收集第3到第5张的糖纸,共有三张。

这道题主要就是用队列进行一个模拟,每次遇到与队列中的某一个颜色相同的颜色就记录当前队列长度并清空队列。这道题与气球游戏相似,这一点在考试时并未想到,所以没AC,但用暴力拿了40分

重要代码

    while (r < n) {
        if (!f[a[r]])
            maxx = max(maxx, r - l + 1);
        while (f[a[r]])
            f[a[l++]] = 0;
        f[a[r++]] = 1;
    }

题目描述:

果老师在玩一个曲线迷题游戏。

在这个游戏中,有一个r\times c的矩形网格,对于整数i(i\leq i\leq N)会被填入网格中(x_i{1},y_i{1})和两\left ( x_i2{},y_i2 \right )个网格。 

现在果老师会尝试用曲线连接所有两两相同的数字,使得曲线不会出网格外并且不会交叉。

果老师希望你能帮他判断是否可能。

输入格式:

输出的第一行为三个正整数R,C,N

接下来的N,每行四个整数x_i1{},y_i1{},x_i2{},y_i2{}。表示填入的网格坐标。

1\leq R,C\leq 10^{8},1\leq N\leq 10^{5}

0\leq x _i1{},x_i2{} \leq R\left ( 1\leq i\leq N\right )

0\leq y_i1{},y_i2{}\leq C(1\leq i\leq N)

给出的坐标点都不重合,所有输入的值都是整数。

输出格式

输入可能输出YES,否则输出NO。

样例输入1

4 2 3
0 1 3 1
1 1 4 1
2 0 2 2

样例输出1

YES 

 此题较为复杂,之前已有详细解析https://blog.csdn.net/bhffvhjbjjikiffg/article/details/131235848?spm=1001.2014.3001.5502

考试时因时间不够,没有仔细分析找规律,最后没有想到与合法括号序列相似,但输出YES骗了65分。

重要代码

int cmp(node x,node y){
	if(x.opt==y.opt){
	if(x.opt==1){
		return x.y<y.y;
	}
	if(x.opt==2){
		return x.x<y.x;
	}
	if(x.opt==3){
		return x.y>y.y;
	}
	if(x.opt==4){
		return x.x>y.x;
	}		
	}

	return x.opt<y.opt;
}
bool check(int x,int y){
	return x==0||x==r||y==0||y==c;
}
int get(int x,int y){
	if(x==0) return 1;
	if(y==c) return 2;
	if(x==r) return 3;
	if(y==0) return 4;
}

 考试总结:本次考试分数较为优异,但仍存不足,如对以前做的题不太熟悉,应定时复习,宽搜代码较为薄弱,应加强,前几题用时较多,最后一题时间不足。本次考试获取的经验有,基础代码应加快速度,给后面几题留出充裕的时间,考试时应有冷静稳定的心态,切勿急躁,应认真分析题面,想想与之前写过的代码有什么相似之处,不会做不要急着放弃,可以暴力拿分或骗分,下次应继续努力。

完结撒花!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hear the Wind Sing.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值