題目描述:
轉圈遊戲
火柴排隊
貨車運輸
積木大賽 花匠
華容道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...