農場裡的生活很艱苦,而且當生活很艱苦,你必須堅強起來。奶牛們形成了編號為1到m的幫派。這些幫派一開始和睦相處了一段時間,但是現在失控了!
奶牛們在競爭一片大草地的控制權。奶牛之間的衝突發生在連續的若干分鐘內。每一分鐘有乙隻奶牛走進草地。如果此時草地上沒有奶牛,那麼這只新進去的奶牛所在的幫派就能占領這片草地。如果草地上已經被新進去的奶牛的幫派所占領了,那麼這只奶牛就在草地裡吃草。否則,乙隻屬於正在占領草地的幫派的奶牛會跟新來的奶牛發生衝突。
這些發生在兩隻奶牛之間的衝突由吵架開始,然後兩隻奶牛就會發現他們的共同點比他們的不同點更多。然後兩隻奶牛發現他們各自的錯誤,就離開他們所在的幫派,走出草地,再去fj的客棧裡喝一杯冷牛奶。如果在某次衝突之後,草地裡沒有奶牛,那麼沒有幫派占領草地。
bessie知道這些衝突是怎麼發生的。她知道每乙個幫派有幾隻奶牛。bessie很想在所有衝突都發生完,每只奶牛要麼在草地上,要麼在fj客棧裡之後,讓她所在的幫派占領這片草地。請你幫助bessie判斷她所在的幫派(編號為1)是否有可能占領草地。
如果有可能占領草地,bessie想知道最後最多能有多少只奶牛是屬於她所在的幫派的。輸出這個數字和能讓bessie的幫派占領草地的字典序最小的方案(每分鐘進入草地的奶牛的幫派編號的序列)。乙個序列x字典序比序列y小的意思是有某個k,x[k]
這題一開始就沒有好的想法,考的時候就棄療了…
而且沒給部分分範圍。。。。
現在假設我們我們不必要求字典序,若給定前面一部分已經選擇的序列,我們要使得後面能有一種方案使得留下的1最多,那麼我們可以這樣放:
首先,剩餘1肯定在最後,中間的(不包含1)可以這樣放:
先按數量從小到大排,按如下(柱狀圖)放,箭頭表示選取方向:
我們可以發現,這樣選取的特點,若展開成乙個序列,那麼相鄰的可以互相抵消,同時,它也是能使前面選擇不管是什麼序列,都可以盡可能將幫派消掉,這樣,我們可以得到乙個最優方案來判斷,當前選擇的序列(前面的),能否滿足答案,剩下的,只需要列舉答案,讓後列舉前面的序列,判斷是否合法就行了。
時間複雜度:o(n2
mlog
n )
貼**:
#include
#include
#include
using
namespace
std;
#define n 102
int n,m,ans;
int a[n],b[n],d[n];
bool p;
struct nodec[n];
void init()
bool cmp(const node&a,const node&b)
sort(c+1,c+sum+1,cmp);
xx=sum;
for (;c[1].y;)else
}while (d[0]!=n)d[++d[0]]=1;
xx=0,yy=0;
for (int i=1;i<=n;i++)
if (!yy||xx==d[i])else
yy--;
return (xx==1)&&(yy==ans);
}bool jian()
++b[j];
}if (!p)return
0; }
return1;}
void work()
}void write()
}int main()
GDOI2016模擬8 8旋轉
alice和bob發明了乙個新的旋轉遊戲。首先,bob給定n個數組成的序列,並把該序列平均分配成若干個塊,每塊正好包含k個數 k能整除n 第一塊由第1到第k個數構成,第二塊由第k 1個數到第2k個數構成,以此類推。接著,bob要求alice對這個序列進行一系列操作,操作有以下兩種 1.把每塊裡面的數...
GDOI2016模擬8 13總結
這次考差了。但事後想了一下,感覺收穫好大。匯報做題情況 當然,裡面不包含收穫 第一題 我的暴力爆零了,原因又是爆int 做題過程中我想到了與眾不同的演算法,一般人會化簡不等式變成斜率優化做,但由於我對斜率優化不大敏感,而且一般斜率優化的題目都是用凸包 叉積來做,這題我也同樣想著用凸包做,但打完發現有...
GDOI2016模擬8 18解密
題目 mirko要解一段加密文,但他只知道某乙個句子是原文的一部分。你的任務是要在密文中找到第乙個對應這個句子的地方。文段是通過用某個單詞 可能和原文一樣的單詞 替換原始文段每乙個單詞來加密的。如果某些單詞在原文出現一次以上,就會使用相同的替換單詞來替換。沒有兩個不同的單詞使用相同的替換單詞。單詞是...