A Clam and Fish
(贪心)
题意:
有一场捕鱼游戏。
有n轮,每一轮都可能会是三种状态。
- 状态0:有0条鱼,0个蛤蜊(鱼饵)。
- 状态1:有0条鱼,1个蛤蜊(鱼饵)。
- 状态2:有1条鱼,0个蛤蜊(鱼饵)。
- 状态3:有1条鱼,1个蛤蜊(鱼饵)。
而题目里的每一轮
i
i
i 都只能 进行以下一种
操作。
- 操作1 : 如果当前状态有
一个
蛤蜊,可以选择把蛤蜊作为鱼饵。之后这个鱼饵可以在后面钓鱼。 - 操作2:如果鱼塘里有鱼,可以不花费鱼饵钓到
1
条鱼。 - 操作3:如果有鱼饵,可以选择掉
一条
鱼。之后鱼饵数减少1
- 操作4: 鱼饵减少1.
思路:
可以动态统计,鱼饵数。
- 之后假如有鱼在鱼塘,那么肯定直接钓鱼。
- 假如没有鱼在鱼塘,详见代码的情况1和情况2.
AC
#include <iostream>
#include <string>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
string s;
int t;cin>>t;
while(t--)
{
int n;cin>>n;
int p=0,ans=0,x;
cin>>s;
int cnt0, cnt1, cnt2;
cnt0=cnt1=cnt2=0;
for(int i=0; i<s.size(); i++)
{
//.string tmp=s[i];
// x=stoi(tmp);
x=s[i]-'0';
// cout<<x<<' ';
if(x==0){if(cnt1){cnt0++;cnt1--;}}//对于什么都没有的情况,有鱼饵那么钓鱼。
else if(x==1)cnt1++;//对于鱼饵数先统计
else cnt2++;
}
// cout<<cnt2<<' '<<cnt0<<' '<<cnt1/2<<endl;
ans=cnt2+cnt0+cnt1/2;//鱼饵数由于可能有多的,那么对于剩下的蛤蜊,一半做鱼饵,一半钓鱼即可。
cout<<ans<<endl;
}
return 0;
}
反思:
其实早就做出来了,不过因为没有考虑 if
的 和 else if
的匹配一直wa。
B Classical String Problem
(思维)
题意:
输入一个字符串,有q此询问。
每次询问有
- A x 回答第x个字符是什么
- C x把字符串的前x个后置(若x为正),反之后x个前置。
思路:
由于每次操作字符串的相对位置不发生变化,本题可以用一个初始位置的指针
去指向第一个元素。
反思:
本题卡cin,cout对于 1 e 6 1e6 1e6,见到就直接scanf或者快读吧。
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
string s;cin>>s;
int len=s.size(),q;
cin>>q;
int start=0;
while(q--)
{
char tmp[10];// string tmp;
int b;
scanf("%s%d", tmp, &b);//cin>>tmp>>b;
if(tmp[0]=='A')printf("%c\n",s[(start+b-1)%len]);//cout<<s[(start+b-1)%len]<<endl;
else start=(start+b+len)%len;
}
return 0;
}
L-Problem L is the Only Lovely Problem
题意:
给你一个字符串,假如它含有前置lovely
,那么这个字符串就是lovely,否则ugly
思路:
由于题目可能不区分大小写,所以这里用一个 ch=tolower(char)
AC
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const string t[2]={"lovely","ugly"};
int main()
{
string s;
cin>>s;
for(int i =0; i<s.size(); i++)s[i]=tolower(s[i]);
int flag=1;
for(int i=0; i<t[0].size(); i++)if(t[0][i]!=s[i])flag=0;
if(flag)cout<<t[0]<<endl;
else cout<<t[1]<<endl;
return 0;
}