1. 程式人生 > >【NOIP 模擬賽】 道路

【NOIP 模擬賽】 道路

line for 兩個 當前 str text cout 平面 臨時


題目描述
在二維坐標平面裏有 N 個整數點,信息班某一巨佬要訪問這 N 個點。剛開始巨佬在點(0,0)處。 每一步,巨佬可以走到上、下、左、右四個點。即假設巨佬當前所在點的坐標是(x,y),那麽它下一步可以移動到(x,y+1), (x,y-1), (x+1,y),(x-1,y)之一。
巨佬目標是找到一個移動序列,滿足下面的條件:
1、從點(0,0)出發。
2、對於給定的那 N 個點,每個點至少被訪問一次。
3、可以選擇那 N 個給定點中任意一個作為結束點。
現在為了增加難度,巨佬的教練規定巨佬走過的所有步數之和的奇偶性必須為wantedParity,顯然 wantedParity 是 0 或 1,是題目給定的, 0 表示偶, 1 表示奇。不過這依然難不到巨佬,但是............
巨佬臨時有事,但是 ta 又不想受教練的批評,所以巨佬向你發出了求助(並且你不可拒絕)如果存在滿足條件的移動序列,那麽輸出 CAN,否則輸出 CANNOT。
多組測試數據。
第一行,一個整數 g,表示有 g 組測試數據,1 <= g <= 50。
輸入格式


第 1 行,N、wantedParity。 1 <= N <= 3000。
接下來有 N 行,每行兩個整數:x, y,表示第 i 個點的坐標值。
範圍都在【-1000000,1000000】。輸入的 N 個點不會有重疊,且不會有(0,
0)點。
輸出格式
共 g 行,每行輸出 CAN 或 CANNOT。
樣例輸入
5
40
-1 -1
-1 1
11
1 -1
31
-5 2
-3 0
23
21
1001 0
-4000 0
30
11 -20
21 42
07
21
0 10
6 -20
樣例輸出
CAN
CAN
CAN
CANNOT
CANNOT

Solution:

  這個題目一眼看上去很吊,還被大佬們故意放在最後一題,但是細想還是不難的

  首先我們可以發現,一個點到另一個點的路徑的奇偶性是不變的,如果不知道為什麽的話,有一個快速的方法:如果它的奇偶性是可以改變的,那麽答案肯定是CAN,因為只要任意改變一條路徑的奇偶性就可以改變整條路的奇偶性,所以不會出現CANNOT的情況,這樣一想,兩點之間的路徑的奇偶性一定是不會改變的。

  想到這一點,這個題目就很好做了,起點是(0,0),終點是n個點中任意一個,而兩點之間路徑的奇偶性又是確定的,所以判斷(0,0)和n個點中每個點的距離的奇偶性,就可以知道有沒有一條在n個點中結束的路徑的長度的奇偶性與給出的wantedParity相同,然後這就是一個大水題了

貼代碼:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    bool flag;
    cin>>T;
    for(int i=1;i<=T;i++)
    {
        flag=0;
        
int n,k; cin>>n>>k; for(int j=1;j<=n;j++) { int x,y; scanf("%d%d",&x,&y); if(flag==0) if((abs(x)+abs(y))%2==k) {flag=1; cout<<"CAN"<<endl;} } if(flag==0) cout<<"CANNOT"<<endl; } return 0; }

【NOIP 模擬賽】 道路