这次比较遗憾的就是第五个,本来直接计算就过了,结果存到一个数组里面一直都在超时,导致这次第五题都没做出来,确实小丑了
话不多说直接看题
A. Creating Words
题解:这题就直接交换一下就OK,没有别的事。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
char a[5];
char b[5];
signed main()
{
cin>>t;
while(t--)
{
cin>>a;
cin>>b;
char s=a[0];
char t=b[0];
a[0]=t;
b[0]=s;
for(int i=0;i<=2;i++)
cout<<a[i];
cout<<" ";
for(int i=0;i<=2;i++)
cout<<b[i];
cout<<"\n";
}
return 0;
}
B. Maximum Multiple Sum
题意,这题就是说不超过n的某个数的所有倍数之和最大(我当时以为是所有数加起来不超过n,所以浪费了一点时间) ,题目也是很水,循环一遍直接过了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int x;
int maxn=0;
signed main()
{
cin>>t;
while(t--)
{
maxn=0;
cin>>n;
for(int i=2;i<=n;i++)
{
int flag=1;
int ans=0;
while(flag*i<=n)
{
ans+=flag*i;
flag++;
}
if(ans>maxn)
{
maxn=ans;
x=i;
}
}
cout<<x<<"\n";
}
return 0;
}
C. Good Prefixes
题解:类似于一种模拟栈的思想吧, 反正对每次加进去的数进行判断即可,同时也设置一个数是所有数的总和,如果新来的这个数是最大值,那么直接和之前的总和比较,看是否相等,然后对于不是的话,就是之前的总和加上这个数,是否等于最大的数
然后模拟一遍直接过
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int a[200005];
int pre[200005];
int cnt=0;
int maxn=0;
signed main()
{
cin>>t;
while(t--)
{
maxn=0;
cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
pre[i]=pre[i-1]+a[i];
}
for(int i=1;i<=n;i++)
{
if(a[i]>maxn)
maxn=a[i];
if(pre[i]-maxn==maxn)
cnt++;
}
cout<<cnt<<"\n";
}
return 0;
}
D. Manhattan Circle
题解:这题也比较水,找出哪一行和那一列有最多的‘#’,然后输出行和列的下标即可,但是我这个菜鸡还是一开始看错数据了,用数组存的,结果数据爆缸了,然后小小修改了十分钟才修改完毕直接过的
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
int numl[200005];
signed main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
memset(numl,0,sizeof(numl));
int flagh=0,flagl=0;
int maxnh=0,maxnl=0;
char s;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=m;j++)
{
cin>>s;
if(s=='#')
{
cnt++;
numl[j]++;
}
if(cnt>maxnh)
{
maxnh=cnt;
flagh=i;
}
}
}
for(int i=1;i<=m;i++)
{
if(maxnl<numl[i])
{
maxnl=numl[i];
flagl=i;
}
}
cout<<flagh<<" "<<flagl<<"\n";
}
return 0;
}
E. Secret Box
题意:其实问的就是在一中状态下能放置的位置最多是多少,其实也是类似于组合数的问题,但是唯一要注意的就是边找边更新,不要存进数组再更新,因为我已经错在这个地方了,看了别的巨佬的代码才发现我这个地方出问题了,我是存进数组去更新的
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t, x, y, z, v;
signed main()
{
cin>>t;
while (t--)
{
int cnt = 0;
cin>>x>>y>>z>>v;
int k;
int ans=0;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=y;j++)
{
if(v%(i*j)==0&&v/(i*j)<=z)
{
cnt++;
k=v/(i*j);
ans = max(ans, (x - i + 1) * (y - j + 1) * (z - k + 1));
}
}
}
cout<<ans<<"\n";
}
return 0;
}
F. Final Boss
题意,就是说给你一个boss的生命值,以及你有n种攻击方式,每种攻击方式都有自己的伤害以及冷却时间,问我们最少多少个回合可以打败这个boss
思路:答案很明确,一定在1到4e10这个答案里面 ,但是我为了谨慎把右边的值写成5e10了,反正都已经这么大了,也没啥区别了,然后二分答案跑一遍就直接AC了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int h,n;
int a[200005];
int c[200005];
int maxn=0;
bool solve(int t)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i]*((t-1)/c[i]+1);
//这里为什么要减一,是因为你在一开始的第一回合就清空弹夹了,你需要减一个1
if(sum>=h)
return true;
}
return false;
}
signed main()
{
cin>>t;
while(t--)
{
maxn=0;//统计最多的攻击次数
cin>>h>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>c[i];
}
int l=1,r=5e10;
int mid;
int ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(solve(mid))
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<ans<<"\n";
}
return 0;
}
G. D-Function
题意:就是说给你一个10的L次方和一个10的R次方,然后问你有多少个数满足上面那个公式
思路,我们要满足上面那个公式,就要去保证每一位乘以k都不会进位,一但进位就会导致结果不匹配,所以没一位都只能在 【0,9/k】中去选择选择一个数,所以就可以得出最后的结果肯定是
(9/k+1)^R - (9/k-1)^L,然后再取模就OK了,但是减法取模记得在最后+一个mod,防止出现负数的情况
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int l,r,k;
int mod=1000000007;
int sum=0;
//快速幂公式
int fast(int a, int b)
{
long long result = 1;
long long base = a;
while (b > 0)
{
if (b % 2 == 1)
{
result = (result*base)%mod;
}
base = (base*base)%mod;
b /= 2;
}
return result;
}
signed main()
{
cin>>t;
while(t--)
{
cin>>l>>r>>k;
sum=(fast(9/k+1,r)%mod-fast(9/k+1,l)%mod+mod)%mod;
cout<<sum<<"\n";
}
return 0;
}