第一次打牛客rating赛
A. 牛牛去购物
反正就一组输入,遍历所有解找极值即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
int n,a,b;
cin>>n>>a>>b;
int m=1e9;
for(int i=0;i<=n/b;i++)
{
m=min(m,(n-b*i)%a);
}
cout<<m<<'\n';
return 0;
}B. 牛牛写情书
先把牛可乐加的字符筛掉,然后用string自带的find()函数查找即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
string s,k;
cin>>s;
cin>>k;
string t;
for(int i=0;i<s.length();i++)
{
if(isalpha(s[i]))
t=t+s[i];
}
if(t.find(k)!=string::npos)
cout<<"YES"<<'\n';
else
cout<<"NO"<<'\n';
return 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() {
ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
memset(v,false,sizeof(v));
for(int i=0;i<=n;i++)
{
a[i].pre=i-1;
a[i].next=i+1;
}
for(int i=1;i<=k;i++)
{
int op,x;
cin>>op>>x;
if(op==1)
{
a[a[x].next].pre=a[x].pre;
a[a[x].pre].next=a[x].next;
}
else if(op==2)
{
cout<<a[x].pre<<'\n';
}
}
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() {
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
ll a,b;
cin>>a>>b;
if(a>b)
swap(a,b);
if(a<b)
{
if(a%3==0)
cout<<"niumei"<<'\n';
else
cout<<"niuniu"<<'\n';
}
else
{
if(a%3==2)
cout<<"niuniu"<<'\n';
else
cout<<"niumei"<<'\n';
}
}
return 0;
}