[noip2011 d1t2]選擇客棧
阿新 • • 發佈:2017-08-18
最大值 blog 思維題 滿足 所有 cstring algorithm 代碼 div
看起來noip特別喜歡考這種思維題==
題意:有n家客棧,每家客棧有一個顏色和一個花費。給定最大允許花費,選擇兩家顏色相同的客棧,問有多少種選擇方式使得兩家客棧之間至少有一家花費允許的最大值的客棧
可以想到一些 n2 甚至 n3 的方法,但顯然不足以滿足所有數據
考慮對於每一家客棧,從右往左掃描,找到第一家滿足條件的顏色相同的客棧,其左邊的所有顏色相同的客棧也就都滿足條件了
所以此題可以巧妙地運用一些臨時變量來記錄當前可行的方案數,從而O(n)地解決問題
詳見代碼
#include<cstdio> #include<cstring> #include<algorithm> usingView Codenamespace std; const int maxk=55; int tot_col[maxk],last[maxk],linshi[maxk]; //tot_col表示每個顏色出現的總次數,last表示該種顏色上一次出現的位置 int main(){ int n,k,p; int pos,ans=0; scanf("%d%d%d",&n,&k,&p); for (int i=1;i<=n;i++){ int color,cost; scanf("%d%d",&color,&cost);if (cost<=p) pos=i; //顯然消費滿足條件的客棧越往右越優,所以在整個過程中只要保留最右邊的一家消費小於q的客棧位置即可 if (pos>=last[color]) linshi[color]=tot_col[color]; //linshi記錄的是在當前條件下,左邊一共有多少家該顏色的客棧滿足條件,讀入時一邊更新即可 ans+=linshi[color]; last[color]=i; tot_col[color]++; } printf("%d\n",ans);return 0; }
[noip2011 d1t2]選擇客棧