一、链接
二、题目、代码及问题
L1-023 输出GPLT
题目:
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....
这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT
的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
getline(cin,a);
int g=0,p=0,l=0,t=0,i,j;
for (i=0;a[i]!='\0';i++)//统计G,P,L,T的数量
{
if (a[i]=='G'||a[i]=='g')//题目要求并不区分大小写
g+=1;
else if (a[i]=='P'||a[i]=='p')
p+=1;
else if (a[i]=='L'||a[i]=='l')
l+=1;
else if (a[i]=='T'||a[i]=='t')
t+=1;
}
for(j=0;j<i;j++)//逐个遍历输出,输出一个数量减一
{
if (g>0)
{
printf("G");
g-=1;
}
if (p>0)
{
printf("P");
p-=1;
}
if (l>0)
{
printf("L");
l-=1;
}
if (t>0)
{
printf("T");
t-=1;
}
if (g+p+l+t<=0)//全部输出完,跳出循环
break;
}
return 0;
}
问题反思:
题目字符串长度较短,可以直接暴力遍历输出。
L1-087 机工士姆斯塔迪奥
题目:
在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。
你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家不能站在释放技能的方格上,否则就会被击中而失败。
给定 BOSS 所有释放技能的行或列信息,请你计算出最后有多少个格子是安全的。
输入格式:
输入第一行是三个整数 N,M,Q (1≤N×M≤105,0≤Q≤1000),表示地图为 N 行 M 列大小以及选择的行/列数量。
接下来 Q 行,每行两个数 Ti,Ci,其中 Ti=0 表示 BOSS 选择的是一整行,Ti=1 表示选择的是一整列,Ci 为选择的行号/列号。行和列的编号均从 1 开始。
输出格式:
输出一个数,表示安全格子的数量。
输入样例:
5 5 3
0 2
0 4
1 3
输出样例:
12
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n,m,s;//行,列,剩余的安全面积
int q,i,j,chonga=0,chongb=0;
cin >> n >> m >> q;
int a[q][2];
for (i=0;i<q;i++)
{
cin >> a[i][0] >> a[i][1];
if (a[i][0]==0)
{
chonga=0;
for (j=0;j<i;j++)
{
if (a[i][1]==a[j][1]&&a[j][0]==0)//检测是否有重复的行
{
chonga=1;//有重复的
break;
}
}
if (chonga==0)//没有重复的 砍一行
n-=1;
}
if (a[i][0]==1)
{
chongb=0;
for (j=0;j<i;j++)
{
if (a[i][1]==a[j][1]&&a[j][0]==1)//检查是否有重复的列
{
chongb=1;//重复
break;
}
}
if (chongb==0)//没重复的,砍一列
m-=1;
}
}
s=n*m;//剩余的就是安全的位置面积
printf("%lld",s);
return 0;
}
问题反思:
注意避免重复的行列(其中有的行列编号相同,注意区分)。