1-翻转数列
思路
感觉此道题有点找规律,取数据的时候,按奇偶性进行选取,但我这种方法只能过60%; 后面参考了别人的解法 原来是可以总结出一个计算公式
s
u
m
=
(
m
2
)
∗
(
n
/
2
m
)
=
n
∗
m
/
2
sum=(m^2)*(n/2m)=n*m/2
sum=(m2)∗(n/2m)=n∗m/2
代码1
#include<iostream>
using namespace std
;
int main() {
long long n
, m
;
while (cin
>> n
>> m
) {
long long sum
= 0;
for (long long i
= 1; i
<= n
; i
++) {
if ((i
- 1) / m
% 2 == 0) {
sum
+= i
* (-1);
}
else {
sum
+= i
;
}
}
cout
<< sum
<< endl
;
}
return 0;
}
代码2
#include<iostream>
using namespace std
;
typedef long long LL
;
int main() {
LL n
, m
;
while (cin
>> n
>> m
) {
cout
<< n
* m
/ 2 << endl
;
}
}
2-纸牌游戏
思路
题目的意思是,牛牛和羊羊采用最优策略,即他们每次抽牌都抽最大的,因此先进行从大到小的排序,排序好后,将依次取牌,偶数代表牛牛取牌,因此+,奇数代表羊羊取牌,因此-。注意这里每张牌的的范围,因此采用long long
代码
#include<iostream>
#include<vector>
#include<algorithm>
typedef long long LL
;
using namespace std
;
bool cmp(LL a
, LL b
) {
return a
> b
;
}
int main() {
int N
;
while (cin
>> N
) {
vector
<LL
> arr(N
);
for (int i
= 0; i
< N
; i
++) {
cin
>> arr
[i
];
}
sort(arr
.begin(), arr
.end(), cmp
);
LL ans
= 0;
for (int i
= 0; i
< N
; i
++) {
if (i
& 0x1 == 1) ans
-= arr
[i
];
else ans
+= arr
[i
];
}
cout
<< ans
<< endl
;
}
}