這次好不容易ak了一次(雖然題有點白給。有的題還是比較考驗思路的。
t1 放棋子
給乙個n*n的棋盤,有n個棋子。棋盤的副對角線不能放棋子(即$i+j=n+1$的位置)。每行每列只能擺乙個棋子。每個棋子都視為是不同的。問有多少種擺法。
$n\leq 1314520$。答案對1e8+7取模。
典型的錯排問題。
我們將題目轉化:有$n$個數,標號為$1$-$n$。第$i$個數不能放到第$i$個位置。有多少種方法。
考慮遞推:設$f_$為放i個棋子的方案數。假設將第$i$個棋子放到第$k$個位置上。
如果將第$k$個棋子放到第$i$個位置上,則此時方案數為$f_$。
如果將第$k$個棋子放到其他位置上,則方案數為$f_$。
因為把$i$放到$k$上有$i-1$種方案。所以$f_=(i-1)\times (f_+f_)$。
特別地,有$f[1]=0,f[2]=1$。
**:
#includeusingnamespace
std;
const
int mod=100000007
;unsigned
long
long f[1314525
]; unsigned
long
long jie=1
;int
main()
for (int i=3;i<=n;i++)
for (int i=1;i<=n;i++)
f[n]%=mod;f[n]=f[n]*jie;f[n]%=mod;
printf(
"%lld
",f[n]%mod);
return0;
}
t2 金明的預算方案
尼瑪竟然考了原題,這就很離譜。
題目描述
對於乙個物品,無非只有五種情況:
1.不買這個物品。
2.買這個物品和它的第乙個附件。
3.買這個物品和它的第二個附件。
4.全都買
5.都不買
如果並沒有第$i$個物品直接把$price[i]$和$im[i]$設為0即可。
也可以先把主件和附件揹包一次,然後再進行分組揹包。我這裡採用的是第二種方法。
**:
#includeusingnamespace
std;
struct
yyya[
60],chi[60][60
];int n,m,b[80][10],t[80],c[80][10],cnt[80],f[32005],ans;//
n為價錢,m為數量
intmain()
}for (int i=1;i<=m;i++)//
對於有依賴的揹包問題,可以事先將他們分到乙個組裡,用「01揹包」的方法取得區域性最優值
}if (!a[i].fa)//
如果不是附件
}memset(f,
0,sizeof
(f));
for (int i=1;i<=m;i++)//
這時候就是分組揹包問題了
for (int j=n;j>=0;j--)
for (int k=1;k<=cnt[i];k++)
if (j>=b[i][k])
f[j]=max(f[j],f[j-b[i][k]]+c[i][k]);
for (int i=0;i<=n;i++)
ans=max(ans,f[i]);//
保險起見,又遍歷了一遍
cout
}
t3 線段樹大綜合
題目大意:讓你區間修改,區間查詢。
內容包括:
1.修改:統一加$x$或統一重新賦值為$x$。
2.區間求和,最大值或最小值。
對於修改,我們要維護兩個tag,分別對應重新賦值和加權。
pushdown的順序是先維護重新賦值的tag再維護加權的tag。因為先前不管怎麼加最後重新賦值和直接賦值是一樣的。所以優先重新賦值。
pushdown的**:
void pushdown(intk)
if(a!=0
)}
然後就是線段樹板子題了,熟練的話20min打完+調完。
ac**:
#include#define ll long longusing
namespace
std;
intn,m;
struct datat[4000001
];void pushup(int
k)void build(int k,int l,int
r)
int mid=(l+r)>>1
; build(k
<<1,l,mid);build(k<<1|1,mid+1
,r);
pushup(k);
}void pushdown(int
k)
if(a!=0)}
void change(int k,int x,int y,int
z)
int mid=(l+r)>>1
;
if(mid>=y)change(k<<1
,x,y,z);
else
if(mid1|1
,x,y,z);
else
pushup(k);
}void add(int k,int x,int y,int
z)
int mid=(l+r)>>1
;
if(mid>=y)add(k<<1
,x,y,z);
else
if(mid1|1
,x,y,z);
else
pushup(k);
}int ask(int k,int x,int y,int
f)
int mid=(l+r)>>1
;
if(mid>=y)return ask(k<<1
,x,y,f);
else
if(midreturn ask(k<<1|1
,x,y,f);
else
}int
main()
else
}return0;
}
後記:這次考試總體難度一般吧。平時認真做題獨立思考的不出意外150+。t1有難度,轉化那一步不太容易想到。t2白給題。t3噁心題,寫錯調半年。
希望我的狀態能保持下去。
考試題題解
主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...
12月14日考試題反思
本大周學習了遞迴和高精。又進行了考試,結果爆零了,總結後是自己沒掌握。還是看題吧!第一題大意 給兩個字串,找出重疊字元輸出對數並排列。題看了很久才明白意思,前面幾問的思路是有的,可排列函式sort的用法卻忘了,想了許久,還是先敲 為上。最初 如下 include using namespace st...
考試題解集合
某天忽然發現自己的blog裡全是考試題解 那麼為什麼不鏈到一篇blog裡呢?避免首頁全是加密blog看起來不大友善,大概也會整齊一點。估計是個大工程但還是作死地開始啦。有些難題是單獨寫的,就不鏈了。密碼仍然是開機使用者名稱 入學年份 兩個班級,希望總是能比過去的自己更用心!2018 4月 14 17...