手推可以得到結果,注意特別判定\(n = 1,2,3\)時的情況
經過手推,可以得到當且僅當n是奇數且0是先手,0才會獲勝。
#include#include#include#define n 100010
using namespace std;
char c[n];
int t,op;
int main()
while (c >= '0' && c <= '9')
return tot * f;
}long long n, m, k;
long long x[maxn], y[maxn], z[maxn], totx, toty, wx, wy;//橫行是x,縱列是y
bool visx[maxn], visy[maxn];
long long ans = 0;
int main()
} else
} }cout << ans << endl;
return 0;
}
倒序操作類似題目:\(bzoj 2054\)瘋狂的饅頭
離線演算法。將所有詢問按照時間順序排序,每次對於新的詢問,都用冒牌排序進行更新,從而求出第\(k\)的值。
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define dd double
#define ll long long
#define mp make_pair
#define pb push_back
#define n 7010
#define m 1010
using namespace std;
int n,q;
struct ma
w[n];
bool cmp1(ma x,ma y)
struct am
q[n];
bool cmp2(am x,am y)
cin>>q;
for(int i=1;i<=q;i++)
sort(w+1,w+n+1,cmp1);
sort(q+1,q+q+1,cmp2);
for(int i=0;i<=q;i++)
}q[i].ans=w[q[i].k].num;
} sort(q+1,q+q+1,c***);
for(int i=1;i<=q;i++) printf("%d\n",q[i].ans);
}
考場思路:四維\(dp\),但是寫掛了。
#include #include #include #include #include using namespace std;
const int maxn = 2009;
int m, n;
int a[maxn], b[maxn];
int ans = 2147483647;
int sa[maxn], sb[maxn];
int f[maxn][maxn];
int main()
for (int i = 1; i <= n; ++i) for (int j = 1;j <= m; ++j) f[i][j] = 0x3ffff;
f[1][1] = 0;
for (int i = 1; i <= n; ++i)
}} }
for (int i = 1; i <= n; ++i)
cout << f[n][m] << endl;
return 0;
}
首先,由於(s2-k2)(s1-k1)每次加上乙個數都要減去1,我們可以預處理全部減一,每次的操作得分就變成s2s1。
因為每個數都是正整數,對於數列1中的連續兩段數a,c數列2中的連續兩段數b,d易得(a+c)*(b+d)>=ab+cd。所以當每次兩個數列都只取乙個數時結果最小。
但是,兩個數列不等長,無法一對一消除。所以可能出現一對多的情況。
綜上,使用dp
f[i][j]表示一數列已刪去i個數另一數列已刪去j個數時的最優解。
\[f[i][j]=min+a[i]*b[j];
\]當兩邊都只取乙個數的時候
\[f[i][j]=f[i-1][j-1]+a[i]*b[j];
\]當其中乙個數列取多個數的時候 \(f[i][j]=f[i][j-1]+a[i]*b[j]\) 表示a中只取乙個數,b中可能取多個數,由乘法分配律\(a\times (b+c)=a\times b+a\times c\)得相對於f[i][j-1]增加的數為a[i]*b[j]
初始化:f=maxlint,f[0][0]=0。
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define dd double
#define ll long long
#define mp make_pair
#define pb push_back
#define n 2010
#define m 1010
using namespace std;
int n,m;
int a[n],b[n];
int f[n][n],g[n][n];
int main()
for(int i=1;i<=m;i++)
memset(f,0x3f,sizeof(f));
memset(g,0x3f,sizeof(g));
f[0][0]=g[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
int ans=min(f[n][m],g[n][m]);
cout<}
QBXT2020十一 Day1 上課筆記
選擇 難度小 好寫的列舉方法 老師甚至講了dfs爆搜最短路,dfs爆搜全宇宙 dfs求解圖中環 記錄vis陣列,查詢是否重複訪問節點 記錄是否入棧,即搜尋過後要將vis歸零 八皇后問題 按行搜尋或者按照列搜尋。noi1999 生日蛋糕 剪枝方法 老師講了單源最短路徑 單源最短路徑 rightarro...
luogu 十一 基本套路 day1
對於乙個線段,要不就只買票,要不就用ic卡 貪心嘛 所以只要比較這兩種策略,取較大值就好。rep i,1,n 1 rd n rd m while m rep i,1,n rep j,1,n 構造相鄰的兩頭牛,看能不能貪心,且看需要滿足什麼條件的時候才能貪心。設有相鄰的兩頭牛a,b,來討論一下在滿足什...
2020寒假集訓Day1 分治 總結
已經會了東西就略過了 下面就是自己新學會的 1 d維數點的bitset暴力方法 o d n 2 w 每個點開d個bitset,分別排序遞推,然後把答案 起來即可 乙個trick bitset按編號分塊,多做幾次,可以節省記憶體,例題 傳遞閉包 想想我以前只會o d n 2 2 cdq分治解決動態凸殼...