Codeforces Beta Round #76 (Div. 1 Only) A. Frames

Harris-H發表於2020-10-18

Codeforces Beta Round #76 (Div. 1 Only) A. Frames (模擬)

題意:給定 n n n個資料夾,每行至多放 m m m個資料夾,給定編號 a , b a,b a,b,求刪除 [ a , b ] [a,b] [a,b]的所有資料夾的最小運算元。

思路:顯然最多我們只需要刪除 3 3 3次,因此我們只需要找出 1 , 2 , 3 1,2,3 1,2,3次分別對應哪些情況即可,事實上我們只需要找兩種,令一種直接 e l s e else else即可。


一.先從 1 1 1開始找。

我們令 a , b a,b a,b分別對應的二維座標位置為 ( x a , y a ) , ( x b , y b ) (x_a,y_a),(x_b,y_b) (xa,ya),(xb,yb)

1.顯然 x a = x b x_a=x_b xa=xb滿足。

2. y a = 1 y_a=1 ya=1 ( y b = m 或 者 b = n ) (y_b=m或者b=n) (yb=mb=n)也滿足。

二.再從 2 2 2開始找。

1. x b − x a = 1 x_b-x_a=1 xbxa=1即兩行滿足。

2. y b + 1 = y a y_b+1=y_a yb+1=ya也滿足。

在這裡插入圖片描述
3. a = 1 a=1 a=1 b = n b=n b=n滿足。
4. y a = 1 y_a=1 ya=1 y b = m y_b=m yb=m滿足。

其他情況為 3 3 3

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int n,m,a,b; 
PII fun(int x){
	int r=(x-1)/m+1,c=(x-1)%m+1;
	return {r,c};
}
int main(){
	scanf("%d%d%d%d",&n,&m,&a,&b);
	//printf("%d,%d\n",r,rest);
	PII p1=fun(a),p2=fun(b);
	 if(p1.fi==p2.fi||(p1.se==1&&(p2.se==m||b==n))) puts("1");
	 else if(p2.fi-p1.fi==1||(p2.se+1==p1.se)||a==1||p2.se==m||b==n||p1.se==1) puts("2");
	else puts("3"); 
	return 0;
}

本題的難點在於需要考慮多種特殊情況,一不小心就很容易遺漏一些情況,因此寫這種題要特別注意考慮全面。

相關文章