Codeforce-1080B & 1077B & 1077A & 1075A
- Codeforce-1080B-Margarite and the best present
- Codeforce-1077B-Disturbed People
- Codeforce-1077A-Frog Jumping
- Codeforce-1075A-The King’s Race
Codeforce-1080B-Margarite and the best present
题目链接
题目大意
给你一个数组,数组元素取值为ai = i * (-1)i,给你两个数l
、r
,要你求出arr[l ~ r]
的和。
解析
- 方法一: 可以使用等差数列求和公式,先全部看做正数,求出所有看做正数的和,然后减去
2 * 奇数的和
,但是要分四种情况看l
、r
的奇、偶情况; - 方法二: 有一个规律,就是前后两个数相加或者是
1
,或者是-1
,然后分情况讨论从奇数开始还是偶数开始即可。
#include <bits/stdc++.h>
typedef long long ll;
// my solution
#if 0
int main(int argc, char const **argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ll T, l, r;
for(std::cin >> T; T--; ){
std::cin >> l >> r;
// regard as 2 arithmetic progression, regard as all to positive number
ll sumAll = (l+r)*(r-l+1)/2;
ll sumNegative;
if( (l&1) && (r&1) )
sumNegative = (l+r)*( (r-l)/2 + 1)/2;
else if( (l&1)==0 && (r&1) )
sumNegative = (l+1+r)*( (r-(l+1))/2 + 1)/2;
else if( (l&1) && (r&1)==0 )
sumNegative = (l+r-1)*( (r-1-l)/2 + 1)/2;
else
sumNegative = (l+1+r-1)*( (r-1-(l+1))/2 + 1)/2;
std::cout << sumAll - 2*sumNegative << std::endl;
}
return 0;
}
#endif
// best way
int main(int argc, char const **argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ll T, l, r;
for(std::cin >> T; T--; ){
std::cin >> l >> r;
ll sum, num = r - l + 1; // numbers
if(num & 1) // odd
sum = num == 1 ? ( l&1 ? -l : l) : ( l&1 ? -l-num/2 : l+num/2);
else // even
sum = l&1 ? num/2 : -num/2;
std::cout << sum << std::endl;
}
return 0;
}
Codeforce-1077B-Disturbed People
题目链接
题目大意
给你一排公寓,0
代表关灯(要睡觉了),1
代表开着灯,如果某个公寓关灯而且他两边的公寓都开着灯,这个公寓就会被吵到(disturbed
),要你手动关掉最少的k
个开着灯的公寓,使得所有人都不会被吵到,求最小的k
。
解析
贪心,这题居然一次就过了,我也没想到真的就是这样"贪"。。就是从左到右,只要有被吵到的,就关掉它右边的公寓的。大概的原因就是前面的选择了最优解,后面肯定可以更加的"省"。
#include <bits/stdc++.h>
const int MAX = 101;
int main(int argc, char const **argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n, arr[MAX];
std::cin >> n;
for(int i = 0; i < n; i++)
std::cin >> arr[i];
int res = 0;
for(int i = 1; i < n-1; i++){
if(arr[i] == 0 && arr[i-1] == 1 && arr[i+1] == 1){
arr[i+1] = 0;
res += 1;
}
}
std::cout << res << std::endl;
return 0;
}
Codeforce-1077A-Frog Jumping
题目链接
题目大意
一个青蛙,给你第三个数a、b、k
,a
代表往正方向跳,b
代表往负方向跳,k
代表跳的步数,要你求最后的位置(数)。
解析
水题。。
#include <bits/stdc++.h>
typedef long long ll;
int main(int argc, char const **argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ll T, a, b, k;
for(std::cin >> T; T--; ){
std::cin >> a >> b >> k;
ll temp = (k/2)*(a-b);
std::cout << ( k%2==1 ? temp+a : temp ) << std::endl;
}
return 0;
}
Codeforce-1075A-The King’s Race
题目链接
题目大意
两个king
,分别在(1,1)
和(n,n)
,目标beautiful coin
在(r,c)
,两个国王都想得到,问谁快。
解析
水题。直接计算距离即可,注意数据大。
#include <bits/stdc++.h>
typedef unsigned long long ull;
int main(int argc, char const **argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ull n, r, c;
std::cin >> n >> r >> c;
ull distW = (r-1) + (c-1);
ull distB = (n-r) + (n-c);
std::cout << (distW <= distB ? "White" : "Black") << std::endl;
return 0;
}