NOIP2013提高組解析

2021-07-22 20:17:11 字數 2822 閱讀 2728

題目描述:

轉圈遊戲

火柴排隊

貨車運輸

積木大賽 花匠

華容道day1

轉圈遊戲:

最終位置實際上就是(x+m*10^k)%n

快速冪即可。

#include#includeusing namespace std;

int n,m,k,x;

int power(int k)

int main()

火柴排隊:

根據感覺可知,大對大,小對小時可得到最小距離。

證明:設a10

將乙個序列先排好,再將另乙個序列先一一對應起來後,再找逆序對的個數即可。

用樹狀陣列就可以解決。

#include#include#include#define maxn 110000

using namespace std;

struct match

return sum;

}int main()

}a[maxn];

struct trucke[maxn];

int head[maxn];

int f[maxn];

int dep[maxn];

bool used[maxn];

int fa[maxn][30];

int mn[maxn][30];

int find(int x)

void insert(int p,int q,int c)

void dfs(int x,int i)

dfs(j,i+1);

} p=e[p].next; }}

int query(int x,int y)

printf("%d",ans);

return 0;

}

花匠:

最簡單的動態規劃:

同時維護f[i][0]表示前乙個到i是增,

f[i][1]表示前乙個到i是減,

用最長子序列做法即可,

加上樹狀陣列優化。

進一步分析:

若g[i]>g[i-1],則f[i][1]=f[i-1][1],f[i][0]=max(f[i-1][0],f[i-1][1]+1)

反之f[i][0]=f[i-1][0],f[i][1]=max(f[i-1][1],f[i-1][0]+1);

達到o(n)的效率。

還可以簡化:據上可知:就是求g序列的拐點個數。

1.

#include#include#define maxn 110000

using namespace std;

int f[maxn][2];

int n;

int a[maxn];

int main()else if (a[i]

2.

#include#include#define maxn 210000

using namespace std;

int a[maxn];

int main()(注意bfs不能經過(i,j)這個點)

d[x][y][i]表示目標棋子在(x,y)朝著i方向時,從起點走過來所需的時間

d[sx][sy][i]=bfs(tx,ty,nextx,nexty)(注意bfs不能經過(sx,sy)這個點,nextx,nexty是指sx,sy在某方向上前進一步後的座標)

思路看似簡單,實現則非常瘋狂。

#include#include#include#include#define maxn 35

#define inf 0x3f3f3f3f

using namespace std;

int a[maxn][maxn];

int n,m;

int direction[4][2]=,

, ,,};

struct point

point(){}

};struct node

node(){}

};bool vis[maxn][maxn];

int ans[maxn][maxn];

int dis[maxn][maxn][4][4];

int d[maxn][maxn][4];

int sx,sy,tx,ty,ex,ey,t;

bool inq[maxn][maxn][maxn];

queueq;

bool inside(int x,int y)

} }return inf;

}void prepare_map()

}}int solve()

memset(inq,0,sizeof(inq));

while (!q.empty())q.pop();

for (int i=0;i<4;i++)

if (inside(sx+direction[i][0],sy+direction[i][1]))

while (!q.empty()){

node p=q.front();q.pop();

inq[p.x][p.y][p.dir]=false;

for (int i=0;i<4;i++){

int nx=p.x+direction[i][0];

int ny=p.y+direction[i][1];

if (!inside(nx,ny))continue;

int dd=d[p.x][p.y][p.dir]+dis[p.x][p.y][p.dir][i]+1;

if (dd

NOIP2013提高組 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOIP2013提高組 花匠

題目描述 花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g...

NOIP2013提高組 積木大賽

春春幼兒園舉辦了一年一度的 積木大賽 今年比賽的內容是搭建一座寬度為 n 的大廈,大廈可以看成由 n 塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。在搭建開始之前,沒有任何積木 可以看成 n 塊高度為 0 的積木 接下來每次操作,小朋友們可以選擇一段連續區間 l,r 然後將第 l 塊到第 r...