蓝桥杯第22场小白入门赛
刚好牛客周赛和蓝桥杯周赛时间撞了,于是毅然决然选择了打牛客,结局是本蒟蒻被牛客薄纱/(ㄒoㄒ)/~~
好吧,然后第二天就来水一水蓝桥杯了(bushi),小白入门赛和前几次一样,6道题只能写5道(什么时候能让我AK,AK了我就不是小白了)
目录
1.变身
2.消灭卡片
编辑 编辑
3.招募队员
4.能量晶石
5.缺失的环节
6.召唤帝皇侠
1.变身
相信大家闭着眼睛也能写出来 /(ㄒoㄒ)/~~
cout<<5<<endl;
2.消灭卡片
思路 :如果能被5整除就直接输出n/5,反之我们对3得个数从0开始枚举,如果n-3*i能够被5整除,就直接输出i+(n-3*i)/5,如果循环了10的6次方还没有那就直接输出-1,为什么要用3枚举呢,是因为我们要尽可能的是5的贡献更大,即组成这个数3的个数尽可能少,5的个数尽可能多,同理用5枚举的话要从大到小枚举,但这样耗时往往会比枚举3的多。
Code:
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int t;cin>>t;
while(t--)
{
int sum=0;
int n;cin>>n;
if(n%5==0)
{
cout<<n/5<<endl;
}
else
{
int mind=1e9;
for(int i=0;i<=n/3;i++)
{
int yu=n-3*i;
if(yu%5) continue;
else
{
mind=min(mind,i+yu/5);
break;
}
}
if(mind==1e9) cout<<-1<<endl;
else cout<<mind<<endl;
}
}
return 0;
}
3.招募队员
思路: 就是计算一个数字最多会连续出现几次,模拟就行了
Code:
#include <iostream>
#include <unordered_map>
using namespace std;
constexpr int N = 1e5+5;
int cnt[N],ans[10],a[N][10];
unordered_map<int,int> mp;
int main()
{
// 请在此输入您的代码
int n;cin>>n;
for(int i=1;i<=n;i++)
{
int b[6]={0};
for(int j=1;j<=5;j++)
{
cin>>a[i][j];
if(mp[a[i][j]]&&!b[a[i][j]])
{
cnt[a[i][j]]++;
ans[a[i][j]]=max(ans[a[i][j]],cnt[a[i][j]]);
}
if(!mp[a[i][j]])
{
cnt[a[i][j]]=1;
mp[a[i][j]]= 1;
ans[a[i][j]]=max(ans[a[i][j]],cnt[a[i][j]]);
}
b[a[i][j]]=1;
}
for(int j=1;j<=5;j++)
if(!b[j])
{
mp[j]=0;
cnt[j]=0;
}
}
for(int i=1;i<=5;i++) cout<<ans[i]<<' ';
return 0;
}
4.能量晶石
思路 :贪心+排序。要使次数最小,则数组的最大值要尽可能小,所以先将数组从小到大排序,从后面开始遍历,每次用后面的数字减去a[0],就是当前这个人要跑的次数,然后a[0]的大小就与当前这个数一样,而其他人增加的数就是这两个数的差值,所以我们只需要累加数组的所有数字更新后与a[0]的差值即可。
Code:
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
constexpr int N = 1e5+5;
int a[N],n;
int32_t main()
{
// 请在此输入您的代码
cin>>n;
vector<int> v(n);
for(auto &t:v) cin>>t;
sort(v.begin(),v.end());
//v.erase(unique(v.begin(),v.end()),v.end());
int d=0;
int len=v.size();
for(int i=1;i<len;i++)
{
v[len-i]+=d;
d+=v[len-i]-v[0];;
v[0]=v[len-i];
}
cout<<d;
return 0;
}
5.缺失的环节
思路: 因为是连续的字符串,所以我们只需要从0开始枚举,每次将十进制转换成二进制字符串,然后判断这个二进制字符串是不是S的子串,如果是的话说明S的某个区间可以组成这个数,反之则是S不存在的数。
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
int32_t main()
{
// 请在此输入您的代码
int n;cin>>n;
string s;cin>>s;
reverse(s.begin(),s.end());
int sum=0;
for(int i=0;i<=1000000;i++)
{
string temp="";
if(i==0)
{
temp+="0";
}
else
{
int a=i;
while(a)
{
temp+=a%2+'0';
a/=2;
}
while(temp.back()=='0'&&temp.size()>1) temp.pop_back();
}
if(s.find(temp)==-1)
{
cout<<i;
break;
}
}
return 0;
}
6.召唤帝皇侠
思路 :数学。这里附上某位大佬的题解
Code:
#include <iostream>
#include <cmath>
#include <unordered_map>
#define int long long
using namespace std;
constexpr int mod=998244353;
int32_t main()
{
// 请在此输入您的代码
int t;cin>>t;
while(t--)
{
int x;cin>>x;
int ed=floor(sqrt(x));
int sum=0;
sum=((sum+ed*ed%mod-1)*ed%mod)%mod;
sum=(sum+ed*ed%mod)%mod;
if(ed*ed+ed<=x)
{
sum=(sum+ed*ed+ed%mod)%mod;
}
if(ed*ed+2*ed<=x)
sum=(sum+ed*ed%mod+2*ed%mod)%mod;
cout<<sum<<endl;
}
return 0;
}