Codeforces Global Round 1
Posted guaguastandup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 1相关的知识,希望对你有一定的参考价值。
作为tourist的(不忠实)粉丝
今天,我们来分析一下,昨晚,tourist的代码
最近查题解的时候,总感觉有的思路比较复杂,或者不太简洁,所以干脆学习一下tourist的代码,机会难得
毕竟很少和tourist打同一场.....
...
难过
总有一天我也要打div1
哼
这一题的第一种思路是tourist这种,十分暴力
他直接用了多项式的公式,并且在[0,k-1)的循环里不断对2取余
我的方法是:
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int N=2e5+100;
const int INF = 1e9;
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int b, k;
cin >> b >> k;
int sum = 0;
int a[N];
for (int i = 0; i < k;i++){
cin >> a[i];
a[i] = a[i] % 2;
sum += a[i];
}
if(b%2==0){
if(a[k-1]==1)
cout << "odd";
else
cout << "even";
//system("pause");
return 0;
}
else{
if(sum%2==0)
cout << "even";
if(sum%2)
cout << "odd";
}
//system("pause");
return 0;
}
如果b是奇数,那么必须保证系数A相加是偶数,结果才能是偶数
如果b是偶数,那么只要看最后的常数项是奇数还是偶数
B题:
这题!!一步之遥我就要写出来了
写题的时候千万要自信,也不要陷在一个思路里面出不来了,这种思维题其实有很多套路可循,而且这种套路其实以前已经遇到过,只是当时没有在意而已
如果tourist能在3min内写完的题,码量肯定不大,一定是有某种方法能很快解决的,
拿到B题,我们想到的首先是找出每段之间的距离,最后看看能选几个直接修复1cm的线段,有几个是需要一条较长的线段去修复的
如果把每两个破碎点之间的距离排序,再进行选择,那么得到的值是不对的,因为原有的顺序被打乱了
那么我们可以选择先假设如果只用一条绷带,需要的长度,
这个长度就是
a[n-1]-a[0]+1;
比如说对于数据
4 100 2
20 30 75 80
只用一条绷带,我们的选择是80-20+1=61cm
现在可以用两条,那么我们可以拿走一段不用它
比如说,把一根木条劈成两半,我们只需要砍一刀
一根木条劈成三份,我们需要砍两刀
那么,如果我们现在需要把一根木条砍成k段,那么可以砍k-1刀,也就可以从原本的那一条长绷带中删去k-1个比较长的绷带,之前已经排过序了,直接减就好了
至于在前面的
b.push_back(a[i+1]-a[i]-1);
比如说
对于
20 30 75 80
最大长度为61
现在减去30到75的那一段,长度是75-30-1;
为什么要减1,
因为(30,75)的长度就是75-30-1;
[30,75)的长度是75-30;
[30,75]的长度是75-30+1;
这个就是区间上长度的选取的问题;
C题
这个C题,
只是因为在人群中多看了你一眼,我脑壳痛到现在
以上是关于Codeforces Global Round 1的主要内容,如果未能解决你的问题,请参考以下文章