Round 99
思路:我们之间去用字符串去统计即可,输入一个字符串,看相邻有没有99即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
signed main()
{
cin>>s;
int n=s.size();
for(int i=1;i<n;i++)
{
if(s[i-1]=='9'&&s[i]=='9')
{
cout<<"YES\n";
return 0;
}
}
cout<<"NO\n";
return 0;
}
缺陷型电脑
思路:怎么说呢?其实就是去看输入的字符串里面最大的ascii码值是多少,输出这个最大的码值即可
我们之间用字符减去‘a’+97即可
找到最大值
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
string s;
void solve()
{
cin>>n;
cin>>s;
int ans=0;
for(char c:s)
{
ans=max(ans,c-'a'+97LL);
}
cout<<ans<<"\n";
}
signed main()
{
cin>>t;
while(t--)
{
solve();
}
return 0;
}
小苯的洞数构造
思路:基本上最高位用4或者8,后面全部用8即可,如果是0,就输出1,否则就是按照洞数去构造
4,8,48,88,488,888这种序列即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
int k;
void solve()
{
cin>>k;
int cnt8=k/2;
int cnt4=k%2;
for(int i=1;i<=cnt4;i++)
cout<<"4";
for(int i=1;i<=cnt8;i++)
cout<<"8";
cout<<"\n";
}
signed main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
前缀和
思路:其实这题只有在奇偶性变换的时候才会用到计数,否则都是偶数,找到规律直接写即可
那么什么时候回出现奇偶性变换呢?就是当p%x==0的时候
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int x,p;
void solve()
{
cin>>x>>p;
if(p%x==0)
{
cout<<(p/x)*2-1<<"\n";
}
else
{
cout<<(p-(p/x))*2<<"\n";
}
}
signed main()
{
cin>>t;
while(t--)
{
solve();
}
return 0;
}
小宇
思路:其实仔细想想这道题,其实会将整个序列分成两部分,左部分,会将当前位置的值都变成下标,右半部分就是不需要变化的,我们只需要枚举从哪个位置开始进行右半部分即可,我们可以知道右半部分的值一定是ai>=i的,并且ai<ai+1的,我们只需要去统计左半部分的数的种类,就是最后的答案了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int a[200005];
void solve() {
int n;
cin >> n;
vector<int> a(n);
map<int, int> cnt, mp;
for (int i = 0; i < n; i++)
{
cin >> a[i];
cnt[a[i]]++;
}
int c = 1E9;
for (int i = n - 1; i >= 0; i--)
{
if (a[i] <= i || a[i] >= c || cnt[a[i]] > 1 || mp.count(a[i]))
{
mp[a[i]] = 1, c = i + 1;
}
else
{
c = a[i];
}
}
cout << mp.size() << '\n';
}
signed main()
{
cin>>t;
while(t--)
solve();
return 0;
}
汉堡猪猪分糖果
思路:将n个糖果分到m个人手上,算其与的值,然后想让这个值最大,那么我们知道只有当m个人在这一位都是1的时候,与出来才是1,因此我们可以从最高位开始枚举,也就是第31位,判断剩下的n是否大于等于m*(1<<bit)如果大于等于,就可以直接让这一位全部变成1
否则 我们要去看剩下的是否能让当前位后面的全部变成1,如果不能,就直接跳过,如果可以就在这一位补充k个人有即可,我们可以列一个式子
n-k*(1<<bit)<=m*(1<<bit)-m
不等式的左边表示剩下的总的个数减去k个有糖果的
不等式的右边表示将剩下的位置填满所需的代价,这个是一定满足的
然后最后算k向上取整即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
void solve()
{
cin>>n>>m;
int ans=0;
for(int i=31;i>=0;i--)
{
int v=1LL<<i;
int cost=m*v;
if(n>= m*(1LL<<i))
{
n-=m*(1LL<<i);
ans+=(1LL<<i);
}
else{
cost-=m;//后面全1的代价
if(n<=cost)
continue;
int k=(n-cost+v-1)/v;
n-=k*v;
}
}
cout<<ans<<"\n";
}
signed main()
{
cin>>t;
while(t--)
{
solve();
}
return 0;
}