LINK:BNUOJ 26475 Cookie Selectionphp
題意:html
你在不停的輸入數字a1,a2,a3,......,ak,當你輸入#時,就把已輸入數字中的第k/2+1刪除,而後剩下的數字又組成一個新的數列a1,a2,......,a(k-1)。把刪除的數輸出來~╮(╯▽╰)╭spa
剛開始理解錯了題意......各類WA......想半天還不知道錯哪.....最後搞清,本身壓根連題目都弄錯了......就沒有再繼續戰鬥的想法了~~~~(>_<)~~~~code
該題要用到優先隊列......具體方法參見代碼ORZ......htm
代碼【一】:blog
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 priority_queue<int> p; 7 priority_queue<int,vector<int>,greater<int> > q; 8 char str[50]; 9 void doit(){ 10 while(p.size()>q.size()){ 11 q.push(p.top()); 12 p.pop(); 13 } 14 while(q.size()>p.size()+1){ 15 p.push(q.top()); 16 q.pop(); 17 } 18 } 19 int main(){ 20 int i,j,k; 21 while(~scanf("%s",str)){ 22 if(str[0]=='#'){ 23 printf("%d\n",q.top()); 24 q.pop(); 25 doit(); 26 } 27 else{ 28 sscanf(str,"%d",&k); 29 if(!q.empty()&&k>q.top()) q.push(k); 30 else p.push(k); 31 doit(); 32 } 33 } 34 return 0; 35 }
//memory:3132KB time:712ms隊列
代碼【二】://這代碼.......不是很懂啊~字符串
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <set> 6 using namespace std; 7 typedef set<double> si; 8 int main(void) 9 { 10 si X; 11 si::iterator it = X.begin(); 12 char str[100]; 13 while (scanf("%s", str) == 1) 14 { 15 if (str[0]== '#') 16 { 17 printf("%.0lf\n", *it); 18 X.erase(it++); 19 if (X.size() % 2) 20 --it; 21 } 22 else 23 { 24 double x = atoi(str)+0.4*drand48(); //atoi(str)能把字符串str轉化爲數字,drand48()產生一個隨機的double數 25 X.insert(x); 26 if (X.size() == 1) 27 it = X.begin(); 28 else 29 { 30 if (x < *it) 31 --it; 32 if (X.size() % 2 == 0) ++it; 33 } 34 } 35 } 36 return 0; 37 }
//memory:10792KB time:1288msget