刚好牛客周赛和蓝桥杯周赛时间撞了,于是毅然决然选择了打牛客,结局是本蒟蒻被牛客薄纱/(ㄒ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;
}