Luogu1090合併果子[單調佇列]
/*
ID:hh826532
PROB:
LANG:C++
*/
#define _FILE_ ""
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<time.h>
#include<fstream>
#include<string>
#include<set>
#include<list>
#include<stdlib.h>
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
#define frei(s) freopen(s,"r",stdin)
#define freo(s) freopen(s,"w",stdout)
#define ll long long
#define u unsigned
using namespace std;
#define rt return
#define inf 0x3f3f3f3f
#define infll 4557430888798830399ll
#define pc(x) putchar(x)
#define spc putchar(' ')
#define gc getchar()
#define ln pc('\n')
#define writeint(x) printf("%d",x)
#define lowbit(x) (x&(-x))
int readuint(){
int s=0;
char c=getchar();
while(c<'0' ||c>'9')c=gc;
while(c>=48&&c<='9'){
s=s*10+c-48;
c=gc;
}
rt s;
}
int readint(){
int s=0,k=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=gc;
if(c=='-'){
k=-1;
c=gc;
}
while(c>=48&&c<='9'){
s=s*10+c-48;
c=gc;
}
rt s*k;
}
void OPENFILE(){
char FILENAME[50];
if(strlen(_FILE_)==0)rt;
sprintf(FILENAME,"%s.in",_FILE_);
frei(FILENAME);
sprintf(FILENAME,"%s.out",_FILE_);
freo(FILENAME);
}
int alen,al,bl,blen,a[100010],b[100010],ans;
int main(){
OPENFILE();
alen=readuint();
if(alen<2)
{
printf("0\n");
rt 0;
}
fr(i,1,alen)
a[i]=readuint();
sort(a+1,a+alen+1);
blen=1;
al=3;
bl=1;
a[alen+1]=inf;
ans=b[1]=a[1]+a[2];
b[2]=inf;
fr(i,1,alen-2)
{
blen++;
b[blen]=0;
fr(j,1,2)
if(a[al]>b[bl]&&bl!=blen)
{
b[blen]+=b[bl];
bl++;
}
else
{
b[blen]+=a[al];
al++;
}
ans+=b[blen];
b[blen+1]=inf;
}
printf("%d\n",ans);
rt 0;
}
大家可以去codevs做一下
本人題目
相關推薦
Luogu1090合併果子[單調佇列]
/* ID:hh826532 PROB: LANG:C++ */ #define _FILE_ "" #include<iostream> #include<stdio.h> #include<algorithm> #incl
合併果子(佇列和優先佇列)
有兩種方法 一種是佇列 一種是優先佇列(priority_queue) 這兩種方法的區別是佇列定義時沒有自動排序 所以只能在輸入的時候按順序才能輸出正解(所以佇列的方法不被認為是正解) 下面是程式碼 比較簡便: #include<bits/stdc++.h> using na
堆排 luogu1090合併果子
#include<cstdio>#include<iostream>using namespace std;int ans,s,hp[10005],n,siz,cnt;void pus(int x)//輸(插)入 {cnt++;hp[cnt]=x;int now=cnt;int fa=
單調佇列及其deque寫法 HDU 3415+Poj 4002 (日期處理) + 合併果子
嘗試用deque寫一下單調佇列,發現速度還是可以接受的,STL依賴症越來越嚴重了。。。。 HDU 3415 Max Sum of Max-K-sub-sequence 題意:給出一個有N個數字(-1000..1000,N<=10^5)的環狀序列,讓你求一個和最大的連續
合併果子【單調佇列】
【問題描述】 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。
CSU-1588 合併果子(堆/單調佇列)
題意 有 nn 堆果子,第 ii 堆果子有 aiai 個,每次合併的代價是兩堆果子個數的總和,求總合並的最小代價。 1≤n≤10001≤n≤1000 思路 堆(優先佇列)的做法已經眾所周知,複雜
洛谷 P1090 合併果子 STL優先佇列
優先佇列 #include<iostream> #include<queue> using namespace std; int n,a[10005]; long long sum; priority_queue<int,vector<int>,greater
NOIP2004合併果子(提高組T2)————優先佇列STL,貪心
題解:本題主要考查優先佇列STL,貪心。若要體力最小,就要將最小的果合併,合併後的果子再入隊。 程式碼如下: #include<iostream> #include<queue> using namespace std; priority_queue<in
luogu1090(堆,排序,貪心)合併果子
每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。 例如
【貪心】CODE[VS] 1063 NOIP2004普及組-合併果子 (刷題記錄(模擬+優先佇列))
日常水題 貪心策略:每次找代價最小的兩對合並,用小根堆來維護,每次合併之後將當前合併結果重新推入佇列,直到合併完成(n-1次) 程式碼如下 #include <cstdio>
合併果子(貪心+優先佇列)
現在有n堆果子,第i堆有ai個果子。現在要把這些果子合併成一堆,每次合併的代價是兩堆果子的總果子數。求合併所有果子的最小代價。 Input 第一行包含一個整數T(T<=50),表示資料組數。 每組資料第一行包含一個整數n(2<=n<=1000),表示果子的堆數。 第二行包含n個正整數ai(
NOIP提高組2004 合併果子(優先佇列排序)
從oj上看到一道問題,合併果子,題意如下: 1171.合併果子 Time Limit: 1000 MS Memory Limit: 32768 KB Total Submission(s): 77 Accepted Submission(s):
2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌圖(仙人掌+單調佇列優化dp)
傳送門 求仙人掌的直徑。 感覺不是很難。 分點在環上面和不在環上分類討論。 不在環上直接樹形 d p
P3084 [USACO13OPEN]照片Photo (dp+單調佇列優化)
題目連結:傳送門 題目: 題目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always
HDU 3401 Trade(DP + 單調佇列優化)
任重而道遠 Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study. He forecasts the next T days' stock market. On
省賽選拔-單調佇列
單調佇列寫法。 Py&hyh想脫單 Description 總所周知,,py和hyh有十分濃烈的脫單意願,但是非常不幸,在一個風和日麗的下午,他們穿越到一個沒有妹子的世界,他必須回答一個問題才能回到本來的世界,這個問題是給出一個nm的矩陣,然後有q次操作,每一個操作,給出xi,y
rqnoj 460單調佇列-1
http://www.rqnoj.cn/Problem_460.html 題意:n個人站成一隊,每兩個人之間如果沒有比一個高的就說明二者能互相看到,問有多少對人能互相看到對方。。 分析:單調佇列,沒的說。。。但是相同高度要特殊處理一下, 這裡我是將連續的相同高度的存到一起並記錄個數。。連續相同高度的
CC April 18 Cutting Plants 單調佇列+思維
題意:長度為n的序列A,B.操作:選定一個區間[L,R]將裡面的數變為h , h<=min(a[L],a[L+1]...a[R]). n<=1e5,1<=a[i],b[i]<=1e9. 問將序列A變為序列B最少需要多少次操作? 無解輸出-1. 假設某次操作是將[L,R]內
HDU 6319 Ascending Rating 單調佇列,(最大值變化次數)
題意:長度為n的序列a.對每個m大小的區間[i,i+m-1],求出該區間的最大值,以及最大值變化的次數. 例如區間(4,2,7,5),最大值變化次數為2. n<=1e7. n<=1e7. 標準解應該為O(n). 容易想到用單調佇列維護每個區間的最大值. 發現正著做單調佇列的過程中,單
【單調佇列】【P3957】 跳房子
傳送門 Description 跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。 跳房子的遊戲規則如下: 在地面上確定一個起點,然後在起點右側畫 $n$ 個格子,這些格子都在同一條直線上。每個格子內有一個數字(整數),表示到達這個 格子能得到的分數。玩家第一次從起點開始向右