程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj 1028 filp and shift

zoj 1028 filp and shift

編輯:C++入門知識

 首先,分解題目,要滿足題目的要求,即相同顏色的小球要連在一起。這一點,我們可以分析出,黑色小球在奇數位置的數目,與在偶數位置的數目相差不過1.【-1,1】;

     接下來,我們看兩種操作,flip操作,交換間隔為1的小球,從這裡可以看出,進行一次交換的時候,小球的相對位置,是不變的,比如1->3->5.

     但是,當n為奇數的時候,不斷變換小球1,小球的位置最終會變成2.也就是,交換了小球的奇偶性。所以,這種情況下,是必然可以達到題目的要求(黑色小球在奇數位置的數目,與在偶數位置的數目相差不過1.【-1,1】;)在這裡,可能有人會有疑問,假設原來位置2的是黑色小球怎麼辦,因為我們知道,要改變奇偶位置,必然是(1)原來的偶數位置少一個或多個黑色的小球,那麼我們總有辦法,把黑色小球填補到那個欠缺的位置,然後再把原來的小球還原到2的位置。

   當n為偶數的時候,我們知道,小球之間的相對位置是固定的,也就是說,奇偶性不能改變,這種情況下,當且僅當小球的位置滿足要求,才能達到目的。

 


下面,上代碼:

 

 

#include<iostream>
#include<string>
//#include<math.h>
using namespace std;
int  _abs(int a)
{
 if(a>=0)
  return a;
 else return -a;

int main()
{
 int test;
 cin>>test;
 while(test--)
 {
  int n,blo=0,ble=0;
  cin>>n;
  int i;
  for(i=1;i<=n;i++)
  {
   int tmp;
   cin>>tmp;
   if(tmp)
   {
    if(i%2)
     blo++;
    else
     ble++;
   }
  }
  if(n%2||(_abs(blo-ble)<=1))
   cout<<"YES"<<endl;
  else
   cout<<"NO"<<endl;
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved