ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目链接:https://codeforces.com/contest/1080
A题
题意:一个请帖需要2个红色,5个绿色,8个蓝色。一个notebook包含了k个相同的颜色。问最少需要多少个notebook能制作n和请帖
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int MOD = 1e9+7;
ll n,k;
int main(){
cin>>n>>k;
ll ans = 0;
ans += (n*2)%k? n*2/k+1:n*2/k;
ans += (n*5)%k? n*5/k+1:n*5/k;
ans += (n*8)%k? n*8/k+1:n*8/k;
cout<<ans;
return 0;
}
B题
题意:序列 − 1 , 2 , − 3 , 4 , − 5 , 6... -1,2,-3,4,-5,6... −1,2,−3,4,−5,6...问从第L个数加到第R个数的和是多少?
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int MOD = 1e9+7;
ll q,l,r,ans;
int main(){
cin>>q;
fo(i,1,q){
cin>>l>>r;
if(l==r){
if(l&1)cout<<-l<<endl;
else cout<<l<<endl;
}else{
if(l&1){
if(r&1){
ans = -r + (r-l)/2;
}else{
ans = (r-l+1)/2;
}
}else{
if(r&1){
ans = -(r-l+1)/2;
}else{
ans = r - (r-l)/2;
}
}
cout<<ans<<endl;
}
}
return 0;
}
C题
题意:有一个黑白棋盘,把其中一个矩阵全涂白,再把其中一个矩阵全涂黑,输出剩下的黑白个数
解法:要考虑融斥,也就是有部分矩阵先被涂白了又被涂黑了
一份不简洁的代码,还有一份简洁的代码
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
int t;
ll n,m,a1,b1,c1,d1,a2,b2,c2,d2;
ll wh = 0, bk = 0;
// 黑涂白
void tu1(ll a, ll b, ll c, ll d){ //白
ll t1 = (c-a)+1;
ll t2 = (d-b)+1;
ll sum = t1*t2;
if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点
if(sum&1){ // 白多
wh += sum/2;
bk -= sum/2;
}else{
wh += sum/2;
bk -= sum/2;
}
}else{ // 黑多点
if(sum&1){// 黑多
wh += sum/2+1;
bk -= sum/2+1;
}else{
wh += sum/2;
bk -= sum/2;
}
}
}
// 白涂黑
void tu2(ll a, ll b, ll c, ll d){ //涂黑
ll t1 = (c-a)+1;
ll t2 = (d-b)+1;
ll sum = t1*t2;
if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点
if(sum&1){ // 白多
wh -= sum/2+1;
bk += sum/2+1;
}else{
wh -= sum/2;
bk += sum/2;
}
}else{ // 黑多点
if(sum&1){// 黑多
wh -= sum/2;
bk += sum/2;
}else{
wh -= sum/2;
bk += sum/2;
}
}
}
// 把原来黑被涂白的再次涂黑
void tu3(ll a, ll b, ll c, ll d){ //白
ll t1 = (c-a)+1;
ll t2 = (d-b)+1;
ll sum = t1*t2;
// 奇奇,偶偶,可简化为相加为偶
if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点
if(sum&1){ // 白多
wh -= sum/2;
bk += sum/2;
}else{
wh -= sum/2;
bk += sum/2;
}
}else{ // 黑多点
if(sum&1){// 黑多
wh -= sum/2+1;
bk += sum/2+1;
}else{
wh -= sum/2;
bk += sum/2;
}
}
}
void solve(){
if((n&1)&&(m&1)){
wh = n*m/2 +1;
bk = n*m/2;
}else{
wh = bk = n*m/2;
}
// 计算相交矩阵
ll X1 = max(a1,a2); ll Y1 = max(b1,b2);
ll X2 = min(c1,c2); ll Y2 = min(d1,d2);
if(X2>=X1 && Y2>=Y1){
tu1(a1,b1,c1,d1);// 黑涂白
tu2(a2,b2,c2,d2);// 白涂黑
tu3(X1,Y1,X2,Y2);// 把原来黑被涂白的再次涂黑
}else{
tu1(a1,b1,c1,d1);
tu2(a2,b2,c2,d2);
}
cout<<wh<<" "<<bk<<endl;
}
int main(){
cin>>t;
while(t--){
ll ax,ay,bx,by,cx,cy,dx,dy;
cin>>n>>m;
cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy;
a1 = min(ax,bx); b1 = min(ay,by);
c1 = max(ax,bx); d1 = max(ay,by);
a2 = min(cx,dx); b2 = min(cy,dy);
c2 = max(cx,dx); d2 = max(cy,dy);
solve();
}
return 0;
}
简洁的
#include<bits/stdc++.h>
using namespace std;
#define ALL(X) X.begin(),X.end()
typedef long long ll;
ll N,M;
ll ASWH(ll r1,ll c1,ll r2,ll c2) // 计算白色有多少个
{
return ((r2-r1+1)*(c2-c1+1)+((r1+c1)%2==0))/2;
}
ll ASBH(ll r1,ll c1,ll r2,ll c2) // 黑色数=总数减去白色数
{
if(r1>r2||c1>c2)return 0;
return (r2-r1+1)*(c2-c1+1)-ASWH(r1,c1,r2,c2);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>N;
for(ll i=1;i<=N;i++)
{
ll RR,CC,r1,r2,c1,c2,r3,r4,c3,c4;
cin>>RR>>CC>>r1>>c1>>r2>>c2>>r3>>c3>>r4>>c4;
ll W=ASWH(1,1,RR,CC); // 总共的白色数
W+=ASBH(r1,c1,r2,c2); // 加上涂白的黑色数
W-=ASWH(r3,c3,r4,c4); // 剪去涂黑的白色数
W-=ASBH(max(r1,r3),max(c1,c3),min(r2,r4),min(c2,c4)); // 减去相交矩阵的白色数
cout<<W<<' '<<RR*CC-W<<'\n';
}
}