第一周集训总结

目录

题目总结:

已完成的题目:

1.  汉诺塔问题—递归

2.  Web Navigation—栈

需要优化的题目:

1.  ABC-363  E-Sinking Land

TLE代码 就超了200ms。。。


题目总结:

已完成的题目:

1.  汉诺塔问题—递归

题目原文:

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

假定圆盘从小到大编号为1, 2, ...

Input

输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。

Output

输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆。

Sample Input

2 a b c

Sample Output

a->1->c
a->2->b
c->1->b

汉诺塔是经典的递归题目,也是我第一次了解什么是递归。

AC代码
#include <bits/stdc++.h>
using namespace std;

void hanoi(int n,char a,char b,char c);

int main()
{
	int n;
	char aa,bb,cc;
	cin >> n >> aa >> bb >> cc;
	hanoi(n,aa,bb,cc);
	return 0;
}

void hanoi(int n,char a,char b,char c)
{
	if(n==0){
		return;
	}
	hanoi(n-1,a,c,b);
	printf("%c->%d->%c\n",a,n,b);
	hanoi(n-1,c,b,a);
}

2.  Web Navigation—栈

题目原文:

你的课程设计是想去写个浏览器,简单的浏览器有四个操作

BACK:访问上一个界面

FORWORD:访问下一个界面

VISIT:访问一个新页面

QUIT:结束访问

当然,你可以利用两个栈来完成这几个操作 现正在访问http://www.acm.org/ ,给出数次操作,输出每次操作后正在访问的页面

Input

多次访问操作,以QUIT结束输入

Output

对每次操作,输出操作后正在访问的页面,若操作越界则输出"Ignored",并将页面停留在边界界面。

Sample Input

VISIT http://acm.ashland.edu/
VISIT http://acm.baylor.edu/acmicpc/
BACK
BACK
BACK
FORWARD
VISIT http://www.ibm.com/
BACK
BACK
FORWARD
FORWARD
FORWARD
QUIT

Sample Output

http://acm.ashland.edu/
http://acm.baylor.edu/acmicpc/
http://acm.ashland.edu/
http://www.acm.org/
Ignored
http://acm.ashland.edu/
http://www.ibm.com/
http://acm.ashland.edu/
http://www.acm.org/
http://acm.ashland.edu/
http://www.ibm.com/
Ignored

这是一道栈的题目,不难但是很适合用来理解栈是什么,栈的特点是最早输入的最晚输出,栈类似于一个放泡腾片的罐子,最早放进去的在最下面,最后放进去的会最早被拿出来。

这到题有一个关键的地方我刚开始没理解被卡了挺久,要注意在每次VISIT一个新网站的时候要注意要把存放FORWARD的栈清空。

没记错的话这道题的OJ不让用万能头<bits/stdc++.h>,这也提醒我要去记要调用的文件不能一直依赖万能头。

AC代码
#include <iostream>
#include <string>
#include <stack>
using namespace std;

char cz[10];
stack<string>now; //创建栈
stack<string>past;
string x="http://www.acm.org/";

int main()
{
	now.push(x);
	while(1){
		cin>>cz;
		
		if(cz[0]=='V'){ //因为这道题的输入开头的字母没有重复的所以我只判断了开头的字母是什么
			cin>>x;
			now.push(x);
			while(!past.empty()) past.pop();
		}
		
		else if(cz[0]=='B'){
			if(now.size()==1){
				cout<<"Ignored"<<endl;
				continue;
			}
			past.push(now.top());
			now.pop();
		}
		
		else if(cz[0]=='F'){
			if(past.size()==0){
				cout<<"Ignored"<<endl;
				continue;
			}
			now.push(past.top());
			past.pop();
		}
		
		else{
			return 0;
		}
		
		cout<<now.top()<<endl;
	}
}

需要优化的题目:

1.  ABC-363  E-Sinking Land

题目原文:

Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 450450 points

Problem Statement

There is an island of H×W, surrounded by the sea.
The island is divided into 𝐻H rows and 𝑊W columns of 1×1 sections, and the elevation of the section at the 𝑖i-th row from the top and the 𝑗j-th column from the left (relative to the current sea level) is Ai,j​.

Starting from now, the sea level rises by 1 each year.
Here, a section that is vertically or horizontally adjacent to the sea or a section sunk into the sea and has an elevation not greater than the sea level will sink into the sea.
Here, when a section newly sinks into the sea, any vertically or horizontally adjacent section with an elevation not greater than the sea level will also sink into the sea simultaneously, and this process repeats for the newly sunk sections.

For each 𝑖=1,2,…,𝑌, find the area of the island that remains above sea level 𝑖i years from now.

Constraints

  • 1≤𝐻,𝑊≤1000
  • 1≤𝑌≤105
  • 1≤𝐴𝑖,𝑗≤105
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

H W Y

𝐴1,1 𝐴1,2 …… 𝐴1,W​

𝐴2,1 𝐴2,2​ …… A2,W​

𝐴𝐻,1 𝐴𝐻,2 …… AH,W

Output

Print Y lines. The i-th line (1≤i≤Y) should contain the area of the island that remains above sea level i years from now.

Sample Input 1

3 3 5

10 2 10

3 1 4

10 5 10

Sample Output 1

9

7

6

5

4

Let (i,j) denote the section at the 𝑖i-th row from the top and the j-th column from the left. Then, the following happens:

  • After 1 year, the sea level is higher than now by 1, but there are no sections with an elevation of 1 that are adjacent to the sea, so no sections sink. Thus, the first line should contain 9.
  • After 2 years, the sea level is higher than now by 2, and (1,2) sinks into the sea. This makes (2,2) adjacent to a sunken section, and its elevation is not greater than 2, so it also sinks. No other sections sink at this point. Thus, two sections sink, and the second line should contain 9−2=7.
  • After 3 years, the sea level is higher than now by 3, and (2,1) sinks into the sea. No other sections sink. Thus, the third line should contain 6.
  • After 4 years, the sea level is higher than now by 4, and (2,3) sinks into the sea. No other sections sink. Thus, the fourth line should contain 5.
  • After 5 years, the sea level is higher than now by 5, and (3,2) sinks into the sea. No other sections sink. Thus, the fifth line should contain 4.

Therefore, print 9, 7, 6, 5, 4 in this order, each on a new line.

大致意思:

输入H行,M列共H x M个岛的高度,海平面的高度初始为0,每年增加1,一共Y年,输出每一年还没有被淹没的岛屿数量。但是判断是否被淹没的前提是海平面的高度大于等于该岛高度,并且该岛附近已经是海了,例如当海的高度为2时,如果有一个岛的高度是1,它的上下左右四个方向都有一个高于海的岛则该岛不会被淹没。

TLE代码 就超了200ms。。。

题目一共46个测试点,AC-9个,TEL-37,两个Sample全过。

暂时不知道该怎么改这段代码,等到后面在说。

//这段代码超时了。。。
#include <bits/stdc++.h>
using namespace std;

struct Node
{
	int hb,f=1; //这里应该是不能给 f赋值的,会报 Waring,不过代码能运行。
}node[1005][1005];

int h,w,y,sum=0;

int main()
{
	cin>>h>>w>>y; //后面也试过把cin,cout改成scanf,printf时间没啥区别。

    /*这一部分是给所有 f赋初始值,因为上面提前给 f赋值了所以没用这段。
	for(int i=0;i<1005;i++){
		for(int j=0;j<1005;j++){
			node[i][j].f=1;
		}
	}
    */
	
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			cin>>node[i][j].hb;
			node[i][j].f=0;
		}
	}
	
	for(int i=1;i<=y;i++){
		for(int a=1;a<=h;a++){
			for(int b=1;b<=w;b++){
				if(node[a][b].hb<=i && node[a][b].f==0){ //判断岛的是否已经被淹没
					if(node[a-1][b].f==1 || node[a+1][b].f==1 || node[a][b-1].f==1 || node[a][b+1].f==1){ //判断该岛周围是否为海
						node[a][b].f=1;//f 用来判断改岛是否被淹没
						sum++; //统计被淹没的岛屿数量
					}
				}
			}
		}
		cout<<h*w-sum<<endl;
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值