竞赛传送门/;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
写在后面:
还是踏踏实实练习吧!不能总想着一些歪门邪道!