A. Candies(简单公式转化)
思路
-
题意:给我一个表达式 : x + 2 x + 4 x + 8 x + . . . + 2 k − 1 = n , n < = 1 e 9 , k > = 2 x+2x+4x+8x+...+2^{k-1}=n,n<=1e9,k>=2 x+2x+4x+8x+...+2k−1=n,n<=1e9,k>=2,给了我们n的值让我求是否存在 一个x值使上登山成立?
-
分析:我可以对公式进行一些变形: x = n / ( 1 + 2 + 4 + . . + 2 k − 1 ) x=n/(1+2+4+..+2^{k-1}) x=n/(1+2+4+..+2k−1),由于我们知道 n < 1 e 9 n<1e9 n<1e9, 那2的31次就已经超过了1e9了,所以我们直接爆类枚举 1 + 2 + 4 + . . . + 2 k − 1 1+2+4+...+2^{k-1} 1+2+4+...+2k−1的和,使两项相除结果为整数,这个整数就是我们要的ans
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
const int mxn = 105;
int n, k, m;
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
ll n;
scanf("%lld", &n);
int k = 2;
int tmp = 2;
while(n%(2*tmp - 1))
{
tmp*= 2;
k ++;
}
printf("%lld\n", n/(2*tmp - 1));
}
return 0;
}
B. Balanced Array(简单构造)
思路
- 题意:给我一个偶数n,问我们能否构造出一个满足下列要求的序列ar
- 序列的前n/2的数都为偶数,后n/2的数都是奇数
- 在ar序列中所有的元素都不同且为正数
- 并且前n/2个元素的和 == 后n/2个元素的和
- 思路
- 首先我们靠虑:n/2(设为x)是奇数还是偶数,如果是奇数那么前面n/2个偶数相加必然是偶数,而后面n/2个奇数相加则一个定是奇数,那么一定构造不出了
- 如果n/2为偶数,这个时候是一定改可以构造出来的,我们从数字2开始往后去n/2个偶数,作为ar的前n/2个元素,并求出他们的和sum,之后我们我考虑 后面的n/2个元素,我们可以从1开始选择n/2-1个奇数,并求出这个n/2-1个奇数的和s,最后一个奇数我们用sum- s就最后一个我们要凑出的奇数
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
const int mxn = 105;
int n, k, m;
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
int n;
scanf("%d", &n);
n/=2;
if(n%2)
printf("NO\n");
else
{
printf("YES\n");
int sum = 0;
for(int i = 1; i <= n; i ++)
{
sum += 2*i;
printf("%d ", 2*i);
}
int s = 0;
for(int i = 1; i <= n; i ++)
{
if(i != n)
{
printf("%d ", 2*i - 1);
s += 2*i - 1;
}
else
{
printf("%d\n", sum - s);
}
}
}
}
return 0;
}
C. Alternating Subsequence(贪心)
思路
-
题意:给我一个一个长度为n的序列ar,其元素值有正有负,让我从ar中找出一个字序列br,而br中相邻的元素符号不同,问在这个我们能在ar中能找到的最长序列br的基础上,br中所有的元素和的值最大是多少?
-
代码:这一题让我求的最大和是
建立在 br最长的基础上
,那我们就可就要保证对于连续相同的符号的数字我们只保留最大的那个,这样我们就能构造出来最长br,并且br 元素和也是最大的
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
#define ll long long
#define INF 0x3f3f3f3f
const int mxn = 2e5 + 10;
int n, k, m;
ll ar[mxn];
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
int n;
scanf("%d", &n);
ll tmp;
int par = 1;
ar[1] = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%lld", &tmp);
if(ar[par] >= 0 && tmp > ar[par])
ar[par] = tmp;
else if(ar[par] >= 0 && tmp < 0)
ar[++ par] = tmp;
else if(ar[par] < 0 && tmp < 0 && tmp > ar[par])
ar[par] = tmp;
else if(ar[par] < 0 && tmp >= 0)
ar[++ par] = tmp;
}
ll sum = 0;
for(int i = 1; i <= par; i ++)
sum += ar[i];
printf("%lld\n", sum);
}
return 0;
}