Code:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
int n , k ; // 2 5 8
cin >> n >> k ;
LL k1 = 2 * n ;
LL k2 = 5 * n ;
LL k3 = 8 * n ;
k1 = k1 / k + ( k1 % k != 0 ) ;
k2 = k2 / k + ( k2 % k != 0 ) ;
k3 = k3 / k + ( k3 % k != 0 ) ;
cout << k1 + k2 + k3 << endl;
return 0 ;
}
B
思路:观察得sn 的规律是 -1 , 1 , -2 ,2 …这样。直接求就行了
Code:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
int q;
cin >> q ;
int l , r ;
while( q-- ){
cin >> l >> r ;
l -- ;
LL ll = l / 2 + ( l % 2 != 0 ) ;
if( l % 2 ) ll = 0 - ll ;
if( !l ) ll = 0 ;
LL rr = r / 2 + ( r % 2 != 0 ) ;
if( r % 2 ) rr = 0 - rr ;
//cout << ll << ' ' << rr << endl;
cout << rr - ll << endl ;
}
return 0 ;
}
C
题意:给你一个m*n的矩阵黑白相间,然后给两个小矩阵的左下和右上的坐标,第一个矩阵范围内的颜色都变成白,第二个都变成黑(按顺序)。问最后多少黑多少白。
思路:
先计算最初的黑白个数。
然后计算第一个,第二个矩阵改变的情况,不考虑相交区域,这个容易计算。
最后将相交区域求出左下与右上坐标,计算黑->黑的改变情况即可。因为刚才没有考虑相交区域,只是简单的将这块区域由最初形态转化为黑色,因此只是将白色转为黑,第一个矩形将这块区域的黑转为白的那块并没有计算,所以是将最初的黑->黑。
Code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T ;
cin >> T ;
while( T-- ){
LL W , B ;
LL n , m ;
cin >> n >> m ; //y x
LL x1 , y1 , x2 , y2 ;
LL x3 , y3 , x4 , y4 ;
W = n * m / 2 ;
B = W ;
if( ( ( n * m ) % 2 ) ) W ++ ;
cin >> x1 >> y1 >> x2 >> y2 ;
cin >> x3 >> y3 >> x4 >> y4 ;
n = y2 - y1 + 1 ;
m = x2 - x1 + 1 ;
W += n * m / 2 ;
B -= n * m / 2 ;
if( ( ( n * m ) % 2 ) && ( ( x1 + y1 ) % 2 ) ) { B -- ; W ++ ;}
n = y4 - y3 + 1 ;
m = x4 - x3 + 1 ;
W -= n * m / 2 ;
B += n * m / 2 ;
if( ( ( n * m ) % 2 ) && ( ( x3 + y3 ) % 2 ) == 0 ) { W -- ; B ++ ;}
LL x5 = max( x1 , x3 ) ;
LL x6 = min( x2 , x4 ) ;
LL y5 = max( y1 , y3 ) ;
LL y6 = min( y2 , y4 ) ;
if( x6 >= x5 && y6 >= y5 ){
n = y6 - y5 + 1;
m = x6 - x5 + 1;
W -= n * m / 2 ;
B += n * m / 2 ;
if( ( ( n * m ) % 2 ) && ( ( x5 + y5 ) % 2 ) ) { B ++ ; W -- ; }
}
cout << W << ' ' << B << endl;
}
return 0 ;
}