第一次打牛客rating赛
A. 牛牛去购物
反正就一组输入,遍历所有解找极值即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
::sync_with_stdio(false);
iosint n,a,b;
>>n>>a>>b;
cinint m=1e9;
for(int i=0;i<=n/b;i++)
{
=min(m,(n-b*i)%a);
m}
<<m<<'\n';
coutreturn 0;
}
B. 牛牛写情书
先把牛可乐加的字符筛掉,然后用string
自带的find()
函数查找即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
::sync_with_stdio(false);
iosint n,m;
>>n>>m;
cin,k;
string s>>s;
cin>>k;
cin;
string tfor(int i=0;i<s.length();i++)
{
if(isalpha(s[i]))
=t+s[i];
t}
if(t.find(k)!=string::npos)
<<"YES"<<'\n';
coutelse
<<"NO"<<'\n';
coutreturn 0;
}
C. 牛牛排队伍
操作次数较多,每一次都是随机一种操作,需要一个比较合理的算法.
想到用静态双向链表,每一次查找和修改都是O(1)的复杂度.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
struct node
{
int pre;
int next;
}a[N];
bool v[N];
int main() {
::sync_with_stdio(false);
iosint n,k;
>>n>>k;
cin(v,false,sizeof(v));
memsetfor(int i=0;i<=n;i++)
{
[i].pre=i-1;
a[i].next=i+1;
a}
for(int i=1;i<=k;i++)
{
int op,x;
>>op>>x;
cinif(op==1)
{
[a[x].next].pre=a[x].pre;
a[a[x].pre].next=a[x].next;
a}
else if(op==2)
{
<<a[x].pre<<'\n';
cout}
}
return 0;
}
D. 牛牛取石子
是我第一次碰到博弈论的问题.
两种操作很相似,找一些不变的东西,比如 9 1
先手必胜(只需要把1
那一堆取走就赢了).
如果只有一堆石子,每一次操作为取1个或2个,那么可以有模仿步.
比如一开始是 a%3
个石子,后面每一次操作都将a
变为3
的倍数(取a%3
个石子),那么最后一次操作必然属于先手方,那么先手必胜;如果
两堆石子和一堆石子有点类似,分类讨论一下.
首先不妨
讨论的过程十分的冗杂,不想过多赘述,只留下结果
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
,b;
ll a>>a>>b;
cinif(a>b)
(a,b);
swapif(a<b)
{
if(a%3==0)
<<"niumei"<<'\n';
coutelse
<<"niuniu"<<'\n';
cout}
else
{
if(a%3==2)
<<"niuniu"<<'\n';
coutelse
<<"niumei"<<'\n';
cout}
}
return 0;
}