D5题解

我真的不知道为什么,我石油管道和数码都有想到正解(尤其是数码)可是我为什么只有大概一半多分,悲伤+不解……

1432. 输油管道 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 65536 KB 

Goto ProblemSet

Description

  请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
  

  油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:

        


  现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。

Input

  第一行包含两个整数R和C(1<=R,C<=25)。
  接下来R行每行C个字符描述被偷之后的形状,字符分为以下三种:
  (1)‘.’表示空;
  (2)字符‘|’(ASCII为124)、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’描述管道的形状;
  (3)‘M’和‘Z’表示城市,两个都是只出现一次。
  输入保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
  输入保证有解而且是唯一的。

Output

  输出被偷走的管道的行号和列号以及管道的类型。

Sample Input

输入1:
3 7
.......
.M-.-Z.
.......

输入2:
3 5
..1-M
1-+..
Z.23.

输入3:
6 10
Z.1----4..
|.|....|..
|..14..M..
2-+++4....
..2323....
..........

Sample Output

输出1:
2 4 -

输出2:
2 4 4

输出3:
3 3 |

思路

 

代码

 

1433. 数码问题 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 65536 KB

Goto ProblemSet

Description

  Alice有一个N*N的格子,把1-N^2按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:
  (1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
  (2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
  Alice想把数X移到(R,C)处可以采用以下方法:
  •如果X不在C这一列,通过旋转行操作把X移到C这一列;
  •如果X不在R这一行,通过旋转列操作把X移到R这一行。
  下面是一个把6移到(3,4)的例子:
  
  Alice现在想采用上述方法,依次把K个数移到各自的目标位置,编程计算每个数需要几次操作。

Input

  第一行包含两个整数N(12<=N<=10000)和K(1<=K<=1000)。
  接下来K行,每行包含三个整数X(1<=X<=N^2)、R和C(1<=R,C<=N),描述需要移动的数以及目标位置。
  Alice必须按照输入顺序依次移动。

Output

  输出K行,每行输出一个整数,表示操作次数。

Sample Input

输入1:
4 1
6 3 4

输入2:
4 2
6 3 4
6 2 2

输入3:
5 3
1 2 2
2 2 2
12 5 5

Sample Output

输出1:
3

输出2:
3
5

输出3:
2
5
3

思路

 

代码

#include<cstdio>
#include<map>
using namespace std;
#define MAXK 1002
int n,k,b;
int r,c;
struct node
{
	int x,y;
}a[MAXK],m[MAXK];
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d%d%d",&b,&r,&c);
		int xx,yy;
		if(b%n==0)
		{xx=b/n;yy=n;}
		else {xx=b/n+1;yy=b%n;}
		for(int j=1;j<i;j++)
		{
			if(xx==a[j].x)
			{
				yy=(yy+m[j].y)%n;
				if(yy==0)yy=n;
			}
			if(yy==a[j].y)
			{
				xx=(xx+m[j].x)%n;
				if(xx==0)xx=n;
			}
		}
		m[i].x=r-xx;
		if(m[i].x<0)m[i].x+=n;
		m[i].y=c-yy;
		if(m[i].y<0)m[i].y+=n;
		a[i].x=xx;
		a[i].y=c;
		printf("%d\n",m[i].x+m[i].y);
	}
}

1434. 灌水 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 65536 KB 

Goto ProblemSet

Description

  学生都很喜欢灌水,第一天只有Alice给她的每个朋友灌了一次水,从第二天开始,所有学生(包括Alice)将会有规律地去灌水:
  •如果前一天被灌了奇数次的水,他们将会给每个朋友灌一次水;
  •如果前一天被灌了偶数次的水,他们将会给每个朋友灌两次水。
  学生编号为1到N,Alice为1号,学生之间的朋友关系会给出。
  计算H天后一共灌了几次水。

Input

  输入一行包含两个整数N和H(1<=N<=20,1<=H<=10^9),表示学生数和天数。
  接下来N行,每行包含N个‘0’或‘1’,(A,B)处的字符表示A和B的关系,‘1’表示是朋友关系,‘0’表示不是。注意自己和自己不是朋友关系,输入保证该矩阵是对称的。

Output

  输出H天后一共灌水的数量。

Sample Input

输入1:
4 1
0110
1001
1001
0110

输入2:
4 2
0110
1001
1001
0110

输入3:
5 3
01000
10110
01000
01001
00010

Sample Output

输出1:
2

输出2:
14

输出3:
26

Data Constraint

Hint

【样例解释】
  样例2中,第一天Alice灌了2次水,第二天学生1和学生4给学生2和学生3都灌了2次水,而学生2和学生3给学生1和学生4各灌水1次,2天一共灌了12次水。
【数据范围】
  50%的数据 H<=1000。

思路

 

代码

 

1435. 开花 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 65536 KB  

Goto ProblemSet

Description

  在遥远的火星上,上面的植物非常奇怪,都是长方形的,每个植物用三个数来描述:左边界L、右边界R以及高度H,如下图所示描述一个植物:L=2,R=5和H=4。
  
  每天都有一个新植物长出来,第一天的植物高度为1,后面每天长出的植物比前一天的高1。
  当一个新植物长出来的时候,跟其他植物的水平线段相交处会长出一朵小花(前提是之前没有长出花朵),如果线段交于端点,是不会长花的。
  下图为样例1的示意图:
  

  给出每天的植物的坐标,计算每天长出多少新花。

Input

  第一行包含一个整数N(1<=N<=100000),表示天数。
  接下来N行,每行两个整数L和R(1<=L<=R<=100000),表示植物的左右边界。

Output

  输出每天长出新植物后增加新花的数量。

Sample Input

输入1:
4
1 4
3 7
1 6
2 6

输入2:
5
1 3
3 5
3 9
2 4
3 8

Sample Output

输出1:
0
1
1
2

输出2:
0
0
0
3
2

思路

 

代码

#include<cstdio>
using namespace std;
#define LL long long
#define MAXN 100005
int n,l,r;
int a[MAXN];
int lowbit(int x)
{
    return x&-x;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int s=0;
        scanf("%d%d",&l,&r);
        printf("%d\n",a[l]+a[r]);
        a[l]=0;a[r]=0;
        for(int j=l+1;j<r;j++)
            a[j]++;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值