今天做了四道题
前言
我们宿舍又来了两个新来的人,一个是学弟,另一个是学长(他说要叫他学姐)
第一题
题目大意
给你一个由{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了
咳咳,今天就到这了······