NOIP2011提高組(選擇客棧)

2022-03-01 02:47:12 字數 3644 閱讀 5478

題目大意:中文題。。。就不解釋了

題目思路:看了其他巨巨的blog寫的,dp思路

#include ///時間複雜度o(n) 空間複雜度o(5n)#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define lson root<<1,l,mid

#define rson root<<1|1,mid+1,r

#define fi first

#define se second

#define ping(x,y) ((x-y)*(x-y))

#define mst(x,y) memset(x,y,sizeof(x))

using

namespace

std;

#define gamma 0.5772156649015328606065120 //

尤拉常數

#define mod 100000007

#define inf 0x3f3f3f3f

#define n 200010

#define maxn 10001000typedef

long

long

ll;typedef pair

pii;

int f[n]; ///

儲存第從1~i-1個客棧消費小於p的最大的客棧編號

int color[n]; ///

儲存1~i-1個客棧和i個客棧顏色相同的客棧個數

int c2[n]; ///

c2[i]=1~i-1號客棧中與第i號客棧色調相同,且到第i號旅館路上存在最低消費不大於p的客棧的客棧數目

int r[n]; ///

第1~i-1的客棧中色調與i客棧相同的最大的編號

int _max[n]; ///

maxc[i]=之前所有客棧中,色調為i的最大編號

intmain()

int ans=0

;

for(i=1; i<=n; ++i) ans+=c2[i];

cout

return0;

}

今天又重做了一遍,有了自己的思路,而且感覺比較清晰

#include ///時間複雜度o(kn) 空間複雜度o(2n+2k)#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define lson root<<1,l,mid

#define rson root<<1|1,mid+1,r

#define fi first

#define se second

#define ping(x,y) ((x-y)*(x-y))

#define mst(x,y) memset(x,y,sizeof(x))

#define mcp(x,y) memcpy(x,y,sizeof(y))

#define min(x,y) (x#define max(x,y) (x>y?x:y)

using

namespace

std;

#define gamma 0.5772156649015328606065120

#define mod 100000007

#define inf 0x3f3f3f3f

#define n 200005

#define maxn 10001000typedef

long

long

ll;typedef pair

pii;

inta[n],b[n];

int color[100]; ///

當遍歷到當前第i個客棧時,保留離當前客棧最近的(不包括當前客棧)

///**低於p的客棧前面的不同色調客棧的分別的和

int hotel[100]; ///

當遍歷到第i個客棧時保留的是前面不同色調客棧的分別的和

intans;

intmain()

ans+=color[tc];

if(tp<=p)

++color[tc];

++hotel[tc];

}printf(

"%d\n

",ans);

return0;

}

第三次解題,這次有較大優化且更易理解

#include ///時間複雜度o(n) 空間複雜度o(3k)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define lson root<<1,l,mid

#define rson root<<1|1,mid+1,r

#define fi first

#define se second

#define ping(x,y) ((x-y)*(x-y))

#define mst(x,y) memset(x,y,sizeof(x))

#define mcp(x,y) memcpy(x,y,sizeof(y))

#define min(x,y) (xy?x:y)

using namespace std;

#define gamma 0.5772156649015328606065120

#define mod 100000007

#define inf 0x3f3f3f3f

#define n 200005

#define maxn 10001000

typedef long long ll;

typedef pairpii;

int f[51];                    ///保留1~i-1色調與i相同且到i途中有合適咖啡館的旅店總數

int hotel[51];                ///保留1~i-1色調與i相同的旅店總數

int last[51];                 ///保留1~i-1色調與i相同的旅店最後出現的位置

int temp;                    ///temp是整個演算法的精髓,temp保留的是符合條件的咖啡館最後出現的位置

int main()

printf("%d\n",ans);

return 0;

}

NOIP2011 提高組 選擇客棧

今天考了noip11年的一些題,這道題是day2 t1,考試的時候我只想出了o n 2 的演算法,拿了七十分,下午改了兩個多小時,但是還是只寫了乙個o nlogn k 的演算法,但是在機房的老爺機上已經可以過了 鏈結在這裡 我們可以把每一種主題相同的客棧先用二維陣列存下來,同時記錄滿足費用 p的客棧...

NOIP 2011 選擇客棧

奇奇怪怪的題目。奇奇怪怪的演算法。題目描述 description輸入描述 input description 共n 1 行。第一行三個整數 n,k,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值 接下來的 n 行,第i 1 行兩個整數,之間用乙個空格隔開...

NOIP2011選擇客棧

題目分析 這是一道比較好玩的題目,情景感比較強。而問題的實質就是 1 將同種顏色的客棧進行處理。2 對於乙個客棧,它有兩種情況,費用超過p 費用不超過p。3 超過p的找之後相同顏色且費用不超過p的。4 不超過p的與之後相同顏色的隨意組合。既然是批量處理,自然想到了字首和。處理3的時候用到了字尾和 想...