前置芝士約瑟夫問題
這樣大概就是板子問題了
考場的樹狀陣列+二分的60分暴力???
1 #include2view code#define int long long
3#define maxn 11000001
4int
c[maxn];
5int lowbit(int x)intn;6
void add(int x,intk)7
12}13int query(int
x)14
19int second_divied(int l,int r,int x,int
last_rs)
2029
else r=mid;
30//
printf("l=%lld r=%lld\n",l,r);31}
32if(query(l)-last_rs==x)return
l;33
else
return
r;34}35
int find(int
pos)
3641
return
pos;
42 }int ans=0;43
void
work2()
4457
else
if(now_rs-last_rs
5867 cir++;sum++;68}
69 ans=second_divied(1,n,1,0
);70 add(ans,-1
);71}72
int t=0;73
signed main()
7483 }
對於約瑟夫問題
我們可以知道最後的人一定是公升到最後的,他在新的隊伍裡的編號是零(因為只有乙個人,從零開始編號)
然後我們從後往前遞推,考慮最後勝利者在上一層的編號直到最後編號
我們假設當前層為4,編號為3
那麼在上一層時因為乾掉了乙個人,那麼就從乾掉的人的後乙個開始編號
所以上一層是在位置6
這樣我們得到f[i]表示在第i次操作後勝利者所處的編號
然後就簡單了
#include#define maxn 10000001using
namespace
std;
int t;int n;int ans=0
;signed main()
printf(
"%d\n
",ans+1
); }
}
模擬8 23 陰陽 DP
對於此題的性質我們考慮dp 分四種情況 黑色塊在右側單調降,單調公升 還有在左側 另外我們這樣可能會記重,所以還要將重複記過的也就是邊界線是橫的和豎的 然後還要將全白全黑加上 1 include2 define maxn 2100 3 define int long long 4using name...
校內模擬 拯救(遞推)
這題年代可久遠了。似乎是今年寒假還是什麼時候loli的測試題來著?反正atp當時太水了不會做。現在越看越覺得當時很蛋疼 不過看這個題目的話,首先它的目標狀態是把所有的都變成0,所以會有乙個f i 表示把前i個都變成0所需要的最少步數 其次,它要改變第i個點的狀態一定是把前i 2個變成0並且把第i 1...
遞推(DP) noip 模擬 不等數列
將 1到 n任意排列,然後在排列的每兩個數之間根據他們的大小關係插入 和 第一行 2 個整數 n,k。乙個整數表示答案。5 266對於 30 的資料 n 10 對於 100 的資料 k n 1000 顯然這絕對不是一道暴力題。很容易就能想到,從1到n將數字乙個個新增進去,同時每新增乙個數字,要麼多乙...