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;
//过60%
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;
}
}