Codeforces Round 952 (Div. 4)(A~E题解)

这次比较遗憾的就是第五个,本来直接计算就过了,结果存到一个数组里面一直都在超时,导致这次第五题都没做出来,确实小丑了

话不多说直接看题

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;
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值