Codeforces Round #636 (Div. 3)——A到C题解

竞赛传送门/;https://codeforces.com/contest/1343

A. Candies(思维)

题目大意:

有一个等比数列,x,2x,4x……,它们的前n项和为Sn,现在给你Sn的值,让你求出x的值。

解题思路:

首先知道等比数列的求和公式
在这里插入图片描述
由此可以将a1的表达式写出来,因为这里的公比是2,所以就是
在这里插入图片描述
让n从2开始迭代(从1的话分母是1,跟谁相除都是个整数),直到上面这个表达式是个整数即可。

AC代码:

#include <bits/stdc++.h>
#define PI 3.141592653589793238462643383279 
using namespace std;
typedef long long ll;
int main()
{
	int t=0;
	cin>>t;
	while(t--)
	{
		ll sn;
		cin>>sn;
		ll an=0;
		int n=2;
		while(sn%(int)(pow(2,n)-1)!=0)
		n++;
		an=sn/((int)(pow(2,n)-1));
		cout<<an<<endl;
	}	
	return 0;
} 

B - Balanced Array(思维)

题目大意:

给你一个数字n,保证n是偶数,问你能否找到一个长度为n的数字,使得其前一半全是偶数,后一半全是奇数,且前后两部分的和相等。

解题思路:

通过举例观察可知,当n是4的倍数的时候才有可能满足条件。而且前半部分是从2开始的偶数,后半部分除了最后一位以外是从1开始的奇数,最后一位是本来该有的这个数加上n/2 。

AC代码:

#include <bits/stdc++.h>
#define PI 3.141592653589793238462643383279 
using namespace std;
typedef long long ll;
int main()
{
	int t=0;
	cin>>t;
	while(t--)
	{
		static int a[200005]={0};
		int n=0;
		cin>>n;
		if(n%4!=0)
		{
			cout<<"NO"<<endl;
			continue;
		}
		else
		{
			printf("YES\n");
			ll x=2;
			for(int i=1;i<=n/2;i++)
			{
				a[i]=x;
				x+=2;
			}
			for(int i=n/2+1;i<=n;i++)
			{
				a[i]=a[i-n/2]-1;
			}
			a[n]=a[n]+(n/2);
		}
		for(int i=1;i<=n;i++)
		printf("%d ",a[i]);
		cout<<endl;
	}	
	return 0;
} 

C - Alternating Subsequence(贪心)

题目大意:

给你一个数组,有正有负,必须选择一正一负的子序列使得这个子序列的和最大。注意审题,是只要有一正一负的情况就必须选择!!! 只有正数或者只有负数的时候可以只选择一个数。

解题思路:

遍历整个数组,如果前一位和后一位的乘积是负数(这两个数的符号不一致),就设置一个随机变量找出后面这些和这个数符号不相同的数字的最大值。然后将这些最大值求和就是最终结果。

AC代码:

#include <bits/stdc++.h>
#define PI 3.141592653589793238462643383279 
using namespace std;
typedef long long ll;
using namespace std;
int main()
{
	int t=0;
	cin>>t;
	static ll a[200005]={0};
	while(t--)
	{
		ll n,Max,Sum=0;
    	cin >> n;
  	 	cin >> a[0];
   		Max=a[0];
   	 	for(int i=1;i<n;i++)
  	  	{
    		cin >> a[i];
     		if(a[i]*a[i-1]<0)
        	{
          	  Sum+=Max;
          	  Max=a[i];
         	  continue;
       		}
        	if(a[i]>Max)
        	Max=a[i];
    	}
   	 	Sum+=Max;
   	 	cout << Sum<< endl;
	}
    return 0;
}

注意开long long

写在后面:

还是踏踏实实练习吧!不能总想着一些歪门邪道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值