赞
踩
题意:
给一个由
n
n
n 个实数组成的数组
将这
n
n
n 个数分为两组,求这两组的平均值的和的最大值
思路:
我就直接说结论把,把除去最大值的其余
n
−
1
n-1
n−1 的数的平均值与最大值相加即可
如何证明不用多说了,有了结论应该很好反证出来
时间复杂度: O ( n ) O(n) O(n)
#include <bits/stdc++.h> using namespace std; int n; long double s[100010]; int main() { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); long double res = 0, ma; scanf("%Lf", &s[1]); res += s[1]; ma = s[1]; for (int i = 2; i <= n; i++) { scanf("%Lf", &s[i]); res += s[i]; if (ma < s[i]) ma = s[i]; } //sort(s + 1, s + 1 + n); res = (res - ma) * 1.0 / (n - 1); res += ma; printf("%.08Lf\n", res); } return 0; }
题意:
有一个由
n
n
n 个不同整数组成的数组。需要按非递减顺序对数组进行排序,方法是将数组精确分割成
k
k
k 个非空的子数组,然后对这
k
k
k 个子数组任意重新排序,最后按新顺序合并子数组
问这种方法是否能成功
思路:
这
n
n
n 个数是彼此不同但并不是连续的,因此只需要在读入的时候同时保存他们的相对位置,然后
s
o
r
t
sort
sort 排序之后判断新序列中有多少数是依旧相邻的,将新的非递减数组用题目所给的方法切割,判断这样精确切割出的子数组数量与
k
k
k 的大小关系即可
因为新旧数组都是由这些精确切割出的子数组数量拼接而成的,因此从新旧数组入手都无所谓
时间复杂度: O ( n ) O(n) O(n)
#include <bits/stdc++.h> using namespace std; int n, m; pair<int, int> s[100010]; int main() { int t; scanf("%d", &t); while (t--) { scanf("%d %d", &n, &m); if (n == 1) { int a; scanf("%d", &a); printf("Yes\n"); continue; } for (int i = 1; i <= n; i++) { scanf("%d", &s[i].first); s[i].second = i; } sort(s + 1, s + 1 + n); int res = 1; for (int i = 2; i <= n; i++) { if (s[i].second != s[i - 1].second + 1) res++; } if (res <= m) printf("Yes\n"); else printf("No\n"); } return 0; }
题意:
创建一个由
n
n
n 个非负整数组成的数组,每个元素都小于
2
k
2^{k}
2k
并且要满足
a
1
&
a
2
&
a
3
&
…
…
a
n
−
1
&
a
n
≥
a
1
⊕
a
2
⊕
a
3
⊕
…
…
a
n
−
1
⊕
a
n
a_{1}\And a_{2}\And a_{3}\And……a_{n-1}\And a_{n} \geq a_{1}\oplus a_{2}\oplus a_{3}\oplus……a_{n-1}\oplus a_{n}
a1&a2&a3&……an−1&an≥a1⊕a2⊕a3⊕……an−1⊕an
求符合条件的数组个数,答案对
1
0
9
+
7
10^{9}+7
109+7 取余
思路:
r
e
s
=
a
1
&
a
2
&
a
3
&
…
…
a
n
−
1
&
a
n
res=a_{1}\And a_{2}\And a_{3}\And……a_{n-1}\And a_{n}
res=a1&a2&a3&……an−1&an
c
n
t
=
a
1
⊕
a
2
⊕
a
3
⊕
…
…
a
n
−
1
⊕
a
n
cnt=a_{1}\oplus a_{2}\oplus a_{3}\oplus……a_{n-1}\oplus a_{n}
cnt=a1⊕a2⊕a3⊕……an−1⊕an
首先看到
2
k
2^{k}
2k时,就将思考的方向放到位运算上,将
r
e
s
res
res 和
c
n
t
cnt
cnt 转换成二进制去想,然后再从最小位逐层向上去比较两者的大小
先假设
k
=
=
1
k==1
k==1 的情况:
一共有
2
n
2^{n}
2n 种方案,可以注意到,只有当左边
n
n
n 个数全都为
1
1
1 时,
r
e
s
=
=
1
res==1
res==1 ,其余情况
r
e
s
=
=
0
res==0
res==0;而右边就不一样了,一个长度为
n
n
n 的
01
01
01数组,一共有
2
n
2^{n}
2n 种组合方式,其中
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为奇数,
c
n
t
=
=
1
cnt==1
cnt==1,剩余
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为偶数 ,
c
n
t
=
=
0
cnt==0
cnt==0
分析到这里,就会意识到需要讨论
n
n
n 的奇偶了:
当
n
n
n 为奇数时,右边
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为偶数,
c
n
t
=
=
0
cnt==0
cnt==0 的情况下,左边由于
&
\And
& 的性质,是必然
r
e
s
=
=
0
res==0
res==0 的;而右边
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为奇数,
c
n
t
=
=
1
cnt==1
cnt==1 的情况下,有且仅有一种情况,即
n
n
n 个
1
1
1 时才有
r
e
s
=
=
c
n
t
=
=
1
res==cnt==1
res==cnt==1 ,其余均为
0
=
=
r
e
s
<
c
n
t
=
=
1
0==res<cnt==1
0==res<cnt==1。所以
n
n
n 为奇数时,有且只有
r
e
s
=
=
c
n
t
res==cnt
res==cnt 的情况是合法的,且方案数为
2
n
−
1
+
1
2^{n-1}+1
2n−1+1
当
n
n
n 为偶数时,右边
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为奇数,
c
n
t
=
=
1
cnt==1
cnt==1 的情况下,只有
0
=
=
r
e
s
<
c
n
t
=
=
1
0==res<cnt==1
0==res<cnt==1 一种情况;右边
2
n
−
1
2^{n-1}
2n−1 种方式中
1
1
1 的个数为偶数,
c
n
t
=
=
0
cnt==0
cnt==0 的情况下,有且仅有一种情况,即
n
n
n 个
1
1
1 时才有
1
=
=
r
e
s
>
c
n
t
=
=
0
1==res>cnt==0
1==res>cnt==0 ,剩余
2
n
−
1
−
1
2^{n-1}-1
2n−1−1 种方案均为
r
e
s
=
=
c
n
t
=
=
0
res==cnt==0
res==cnt==0 。所以
n
n
n 为偶数时,合法的方案数为
2
n
−
1
2^{n-1}
2n−1,一种是
r
e
s
>
c
n
t
res>cnt
res>cnt,其余为
r
e
s
=
=
c
n
t
res==cnt
res==cnt
分析完
k
=
=
1
k==1
k==1 的特殊情况之后,就需要继续拓展,即将
r
e
s
res
res 和
c
n
t
cnt
cnt 的二进制状态由一位数向
k
k
k 位数延伸
先看当
n
n
n 为奇数时,因为它只有等于这一种合法方案,所以想要求合法的方案,就需要让
r
e
s
res
res 和
c
n
t
cnt
cnt 的二进制状态的每一位都是相等的,所以最终的方案数为
k
∗
(
2
n
−
1
+
1
)
k*(2^{n-1}+1)
k∗(2n−1+1)
而
n
n
n 为偶数时就比较麻烦了,因为它的每一位都有败(
r
e
s
′
<
c
n
t
′
res'<cnt'
res′<cnt′,单层方案数为
a
a
=
=
2
n
−
1
aa==2^{n-1}
aa==2n−1)、胜(
r
e
s
′
>
c
n
t
′
res'>cnt'
res′>cnt′,单层方案数为
b
b
=
=
1
bb==1
bb==1)、平(
r
e
s
′
=
=
c
n
t
′
res'==cnt'
res′==cnt′,单层方案数为
c
c
=
=
2
n
−
1
−
1
cc==2^{n-1}-1
cc==2n−1−1)三种状态(
′
'
′ 表示二进制的一位),所以要用前
i
−
1
i-1
i−1 层的方案数(设成a、b、c吧)去推导前
i
i
i层的方案数(设成A、B、C吧):
A = a * (aa + cc) + b * aa + c * aa ;
B = a * bb + b * (cc + bb) + c * bb ;
C = c * cc ;
最终的方案数为
B
+
C
B+C
B+C
然后在计算过程中记得取余
时间复杂度: O ( k ) O(k) O(k)
#include <bits/stdc++.h> using namespace std; long long n, k; const long long mod = 1e9 + 7; long long qmi(long long a, long long b) { long long res = 1 % mod; while (b) { if (b & 1) res = (long long)res * a % mod; a = (long long)a * a % mod; b >>= 1; } return res % mod; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%lld %lld", &n, &k); if (k == 0) { printf("1\n"); continue; } if (n & 1) { long long a = qmi((long long)2, n - 1) % mod; a = (a + 1) % mod; long long r = a; for (int i = 1; i < k; i++) { r = (r * a) % mod; } printf("%lld\n", r); } else { long long a = qmi((long long)2, n - 1) % mod; //败 long long b = 1; //胜 long long c = (a - 1 + mod) % mod; //平 long long aa = a, bb = b, cc = c; long long aaa, bbb, ccc; for (int i = 1; i < k; i++) { aaa = (a * (aa + cc) % mod + b * aa % mod + c * aa % mod) % mod; bbb = (a * bb % mod + b * (cc + bb) % mod + c * bb % mod) % mod; ccc = (c * cc) % mod; a = aaa; b = bbb; c = ccc; } printf("%lld\n", (b + c) % mod); } } return 0; }
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。