暑假还是不能摸鱼了,尽量每天补一道题。
这里大部分的补题应该都是参考了大佬的题解,所以如果有大佬看到了自己的解法,请多多包涵。
A题
题目描述
题目意思:有这么一个钓鱼游戏。这个游戏包含n个区域 1-n。区域分为四种。
type 0:无鱼无蛤 ; type 1:无鱼一蛤;
type 2:一鱼无蛤; type 3:一鱼一蛤。
每个区域都可以选择一种操作执行:
1.如果该区域有一蛤,你可以用这一蛤做一包鱼饵。你的鱼饵包数加一。你可以用这一包鱼饵在之后的区域抓鱼。
2.有一鱼,可以不用鱼饵抓鱼。鱼饵包数不会改变。
3.如果你至少有一包鱼饵,且当前区域没鱼。可以用一包鱼饵换成一鱼。
4.什么都不做。
下面给出n个区域,试求最大捕鱼数。
题目思路
这道题当时是队友做的,我自己还没看
第一眼就感觉,处理字符串即可,1攒鱼饵,2攒鱼,3攒鱼,0看之前鱼饵多少判断是否攒鱼。1全攒鱼饵可能会多,所以把多出来那一部分一半转化为用鱼饵抓鱼即可。
代码
#include<iostream>
#include<string>
using namespace std;
const int N=2e6+5;
int n,t;
string stage;
int main()
{
cin >> t;
while(t--)
{
cin >> n >> stage;
int ans=0,bait=0;
for(int i=0;i<n;i++)
{
if(stage[i]=='0')
{
if(bait)
{
bait--;
ans++;
}
}
else if(stage[i]=='1') bait++;
else ans++;
}
cout << ans+bait/2 << endl;
}
return 0;
}
B题
题目描述
题目思路
这个题目是真的够经典,当时进组师傅第一个教的题目好像就是这个。不按照题目所说的真去操作字符串,这样会爆,直接找一个变量记录移动后字符串首元素是第几个就行。
但是这道题思路出来,我就是没能过,队友改了两三个地方才过,好像是有些地方的取模。当时队友a了就没管了,自己还是有点模糊。
最后发现是pos和输出方式可能有问题,pos可能会爆,输出方式可能会导致超时。
代码
#include<iostream>
#include<string>
#include<cstdio
using namespace std
int q,x,pos
char c;string str
int main(
{
cin >> str >> q;
int num = str.size();
while(q--)
{
scanf(" %c %d",&c,&x);
if(c=='A')
{
cout << str[(pos+x-1+2*num)%num];
printf("\n")
}
else
{
pos = (pos + x + num) % num;
}
}
return 0;
}
C题
题目描述
这个题目大概意思就是说给你一些坐标,然后根据给出的手掌形状,判断是左手还是右手,有很多组样例。
题目思路
这个题目当时看的时候就想到给出了很多点,但是肯定不是都要用到,不然处理量太大了。队友也是这么想的,但是想的有些缺漏之处,没有考虑给出点是按照顺时针还是逆时针。我当时顺着队友先找最长边的思路往后延展,再找出其它能判断左右手的特征一起判断。我的想法大概是把最长边,次最长边都找出来,结合他们的的三个点来判断。(我拿了一个30°三角板比了一下,找出来一个规律)先找出这三点x坐标最大的点,然后再根据另外两个点的相对位置判断手的左右。注意 这两个点要根据所在边区别出来是哪一个。比如说直角点在最右边,最大边对应点y小于次大边y那么就右手。这个情况就不细细介绍了,因为我发现这个方式容易绕晕,还是用大佬的简单方法比较好。
至于大佬的解法,是最大边和相邻两边的关系来判断。我自己的方式是3乘2种情况,大佬方式应该是2乘2种情况。
代码
最近不知道为什么粘贴代码总是抽风,暂时还没解决,先放一下等解决完这个问题再粘。
F题
题目描述
给出t组询问,每组包含两个正数a,b。
对于每组询问,给出一组满足要求的正数c,d,e,f。
如果有多组解,输出一组就行。
题目思路
这道题是我从题目列表里面一眼看过来感觉题目还算看得懂的一道题,然后先来补了。从题面来看,几个限制给得很有细节,第二条要求就是其中之一。
自己想了一下感觉一下子有点无从下手,于是去看了一下其它人的题解。感觉这一篇对于式子的变形解释得比较清楚。
这位大佬是从要求一着手,根据给出的a,b是不是最简情况,分出来三种情况。(看的另一篇题解也是分三种,但是它是从b是不是质数分析的),我自己的分析就不给出了,感觉我可能分析会有不对的地方
这两天打算把exgcd认真整一下,感觉很多题目都利用了这个的原理。