SRM605題解(T3除外)

2021-06-22 18:23:27 字數 1136 閱讀 1225

t1:

題目大意:給定n個物品,每個物品有兩個屬性a[i]和b[i]。選擇一些物品使得c*d最大化,其中c為所選物品中a[i]的不同的數字個數,d為所選物品中b[i]的總和。

主要思路:由於a[i]比較小,所以可以對不同的a[i]進行一次dp,f[i]代表從所有a[i]==i的物品中選擇乙個子集使得權值和最大。g[i]代表選擇了i個不同的a[i]所獲得的最大權值。 g[i]=max(g[i],g[i-1]+f[j])。max(g[i]*i)就是答案。

#include#include#include#include#includeusing namespace std;

int f[200];

class alienandhamburgers

return ans;

}};

t2:題目大意:給你2n個數字,將它們分成兩個有n個元素的幾何。對於所有1<=i<=n,|a[i]-b[i]|>=k,a[i]為第乙個組的第i小的元素,b[i]為第二組的第i小的元素。求有多少不同的方案。

主要思路:由於k<=10,所以可以考慮狀壓dp,f[i][j][opt]代表處理到第i個數字,小於i-k的數字有j個還沒有分組,大於等於i-k且小於i的數字有opt狀態還沒分組的方案數。每次我們可以選擇將第i個數進行分組或者忽略i。這樣f求出來的方案必定是預設a[i]>=b[i],所以我們再定義g[i]:兩個集合的前i個元素已經分好的方案數。g[i]=sigma(g[j]*f[(i-j)*2][0][0]),代表兩個集合第j個元素的大小順序和第j+1...i個元素的大小順序不同,即 a[j]>b[j] -> a[k]

#include#include#include#includeusing namespace std;

int f[101][101][1000];

int g[51];

const int p=1000000007;

int c[101][101];

int find(int x,int y)

class alienandsetdiv1

memset(g,0,sizeof(g));

g[0]=1;

n/=2;

for (int i=1; i<=n; ++i)

for (int j=0; j

SRM606題解(除T3外)

t1 題目大意 兩個人玩遊戲,第乙個人猜數字,第二個人回答和正確數字相差多少。進行n次後,問正確數字是多少。主要思路 模擬!include include include include includeusing namespace std void swap int a,int b int abs...

汕頭市隊賽 SRM16 T2

描述 貓和老鼠,看過吧?貓來了,老鼠要躲進洞裡。在一條數軸上,一共有n個洞,位置分別在xi,能容納vi只老鼠。一共有m只老鼠位置分別在xi,要躲進洞裡,問所有老鼠跑進洞裡的距離總和最小是多少。輸入格式 兩個用空格隔開的整數m和n。這一行m個數字分別表示老鼠的位置 接下來n行每行兩個數字分別表示洞的位...

SRM13 T3 花六遊鳥小(結論題)

哇這題是真的喵,hr智商太高辣 這題的難點就是看了題解之後怎麼證明題解裡的結論.結論 深度大於logm的點肯定能達到最大值 證明 顯然乙個西瓜的屬性裡0數量一半1數量一半我們取到的1數量最少,所以我們最多logm個點就可以把所有屬性取到1 結論 未達到最大值的點相鄰兩個肯定價值不同 證明 易證,取反...