纪中学习之(第二季)DAY TWO

本文记录了作者完成的四道编程题目,涉及括号匹配、蛋糕切割、棋盘皇后移动和火车站利润优化问题。解题策略包括栈、前缀和、动态规划等,并分享了部分代码实现和遇到的问题。
摘要由CSDN通过智能技术生成

今天做了四道题

前言

我们宿舍又来了两个新来的人,一个是学弟,另一个是学长(他说要叫他学姐)

第一题

题目大意

给你一个由{a,b…z,A,B….Z}组成的字符串,我们把大写字母{A,B….,Z}当作括号,这26个字母形成13对括号,(A,Z),(B,Y)….(M,N),每对中的第一个字母表示左括号”(”,第二个字母表示右括号”)”,输出1或0,1表示匹配,0表示不匹配.


输入样例

12
AabcZBBefYeY

输出样例

1


解题思路

这道题是用栈来做的,先把大写字母放入栈,再一个一个的判断是否相对

程序如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,ch[2000010];
bool f;
string a;
int main()
{   
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
    scanf("%d",&n);
	while(n)
	{
		memset(ch,0,sizeof(ch));//用来装栈
		f=0;//初值
		int d=0;
		cin>>a;
		for(int i=0;i<=n-1;i++)
		{
			if(a[i]>='A' && a[i]<='M')
				ch[++d]=a[i]-'A'+1;//判断是否为左右括号
			else if(a[i]>='N' && a[i]<='Z')//因为是分开两边
			{
				if(ch[d]=='Z'-a[i]+1) //因为怕0,所以要加一
				{
					ch[d]=0;
					d--;
				}
				else 
				{
					f=1;
					break;//因为尽然都不行,所以要变成一
				}
			}
		}
		if(d)f=1;
		if(f) puts("0");//要换行
    	else puts("1");
    	n=0;
    	scanf("%d\n",&n);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}



第二题

题目大意

第一行是一个整数N,表示蛋糕的边长。接下来N行,每行N个字符(“#”或”.”)描述蛋糕的情况.
输出第一行输出一个整数M表示你最大可以获得巧克力的个数。接下来输出两个整数R和C,描述切割方法,R表示水平切线是介于第R行和R+1行之间,C表示垂直切线介于第C列和第C+1列之间。如果有多种切法,输出任意一种即可.


输入样例

8
…#…#…
.##…#…
…#.
.##…
…#.#…
…#.

…#…#…

输出样例

3
3 4


解题思路

这道题一开始想用暴力,但考虑会超时,就用了(暴力+前缀和)听大佬说也是暴力

程序如下

没改好,==谅解==

第三题

题目大意

在棋盘上,玩家一和玩家二不断的移动皇后,直到移到左下角才算赢.
第一行包含一个整数N,描述棋盘的大小,第二行输入两个整数i,j,其中i表示开始皇后所在列,j表示行。


输入样例

6
2 4

输出样例

2




第四题

题目大意

你在火车站开饭店,但不允许同时在两个相连接的火车站开。你可以获得的最大利润为多少
第一行输入整数N,表示有N个火车站,。接下来N行,每行一个整数表示每个站点的利润,接下来N-1行描述火车站网络,输出最大利润


输入样例

6
10
20
25
40
30
30
4 5
1 3
3 4
2 3
6 4

输出样例

90

没打出来程序


解题思路

这道题其实用树状动规.
利用链式储存结构。对于每一个顶点,开一条链,依次存储以该点为起点的边。
(这道题和另一题很像)

程序如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,l,k,tot;
long long f[60001][601],a[60001],head[60001],b[60001],s[60001];
struct abc
{
	int x,to,next;
}e[1000000];
void qu(int w)
{
	f[w][1]=a[w];
	for(int i=head[w];i;i=e[i].next)
	{
		f[w][1]=f[w][1]+f[e[i].to][0];
		f[w][0]=max(f[e[i].to][1],f[e[i].to][0])+f[w][0];
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	  for(int i=1;i<=n-1;i++)
	  {
	    scanf("%d%d",&l,&k);
	  }	
	    	for(int i=1;i<=n;i++)
	    	{
	    		if(b[i]!=1)
	    		{
	    			qu(i);
	    			s[i]=max(f[i][1],f[i][0]);
	    			printf("%d",s[i]);break;
	    		}
	    	}
	return 0;
}
但不知道明明样例AC了,但还是WA了

咳咳,今天就到这了······

明天继续更新·································

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值