題意:就是給你2n個人 每個人之間都有競爭力,讓你組成兩個隊,使這兩個隊之間的所有成員競爭力和最大(本隊之間無競爭力)
題解:兩種解法:1.起始兩隊都為空,爆搜的時候每個人都往兩隊間放一次,算出隊內的成員競爭力最小時,隊外的競爭和一定最大。2.a隊先放乙個人,其他人都放b隊,預處理出第乙個人和其他所有人的競爭力和,再依次從b裡拿出乙個人往a裡放,減掉第乙個人和這個人的競爭力,加上這個人和其餘人的競爭力,知道a裡人湊滿n個人。
第一種解法:
#include#include#include#include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
typedef long long ll;
int n;
int tmp[50][50];
vectora,b;
ll tot=0;
ll ans=0;
ll na,nb;
void dfs(int x,ll sum)
if(x>=2*n) return;
if(a.size()>n||b.size()>n) return ;
if(a.size()>n;
for(int i=0;i<2*n;i++)
} dfs(0,tot/2);
cout《第二種
#include#include#include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
typedef long long ll;
int vis[50];
int tmp[50][50];
ll ans=0;
int n;
ll res=0;
void dfs(int x,int cnt,ll sum)
if(x>=2*n) return ;
if(x>cnt+n) return ;
ll cost=0;
//取
vis[x]=1;
for(int i=0;i<2*n;i++)else
} dfs(x+1,cnt+1,sum+cost);
//不取
vis[x]=0;
dfs(x+1,cnt,sum);
}int main()
} ll sum=0;
vis[0]=1;
for(int i=0;i<2*n;i++)
dfs(1,1,sum);
cout
}
2019牛客多校第二場
蒙特卡洛 猜答案 注意答案要累乘 最大的可以用rmq rmqrm q做然後挖掉四個角分別再做一次即可 掛一下大佬的鏈結 最重要的是學會了字首和查詢相差為1 11的時候的奇技淫巧 include include define fo i,a,b for i a i b i define fd i,a,b...
2019牛客多校第二場
乙個0到n 1的環,初始在0,每次隨機前進或後退一格,當所有點都訪問過就結束,問結束時站在k的概率是多少。注意輸出的是字首積 一開始站在0,最後顯然不可能在0,剩下n 1格,隨機數打表發現概率相同,都為 frac include using namespace std typedef long lo...
2019牛客多校第二場
upsloved 有乙個長為 n 的環,一開始位於 0 每次隨機向前或者向後走,求最後乙個走到 m 的概率 ps 這題實際上求的是所有詢問的字首積 實際上概率相等 俺也不知道為啥 如果 m 0 則概率是 frac 1 特判 n 1,m 0 就行了 不放了 solved at 03 54 2 有乙個無...