51nod 1321 收集點心 動態規劃

2021-08-10 06:36:51 字數 1774 閱讀 7909

城市裡有乙個點心店,裡面有許多不同的點心。已知這些點心有以下特點:

(1)這些點心被設計為n種不同的形狀,不妨將不同的形狀標號為0,1,2,3..n-1;

(2)這些點心被製作為n種不同的口味,不妨也將不同的口味標號為0,1,2,3..n-1;

(3)你在購買點心時,只能觀察到它們的形狀,卻不知道它們的口味;在購買時,你只能告訴服務員,「我要買形狀i的點心m個,形狀j的點心k個…」,然後服務員會隨機為你挑選恰好m個形狀為i的點心,恰好k個形狀為j的點心,…。

(4)你在購買後品嚐完了,你才知道每個點心具體是什麼味道;

(5)對於每種形狀i的點心,它一共只有恰好兩種不同的口味;

(6)對於每種口味j的點心,它也恰好被製作為兩種不同的形狀;

(7)店員告訴你,現在店裡有恰好num1[i]個點心是形狀i 且是口味type1[i]的;同時,恰好有num2[i]個蛋糕是形狀i 且是口味type2[i]的。type1[i]!=type2[i],注意店員並不能區分相同形狀的點心是哪種口味。

現在問題來了,在不品嚐的前提下,至少購買多少數量的點心,才能確保購買到了所有n種不同口味的點心。注意,並不一定需要包含所有n種形狀。

2<=n<=1000

把每種形狀和每種口味都看做乙個點,建圖後顯然就形成了若干個黑白交替的環。那麼就可以大力拆點dp了。

具體來講就是,假設一種點心有兩種口味,分別有a和b個,不妨設a < b,那麼我們可以花費a+1的代價使得我們選的裡面至少含有種類b,也可以花費b+1使得兩種口味都有。(我一開始就是被這裡坑了)。

然後就可以列舉拆那個點來做dp就好了。

注意列舉到的那個點不一定不選,可能也會被選。(第二次就是被這裡坑了)。

#include

#include

#include

#include

#include

using namespace std;

const int n=2005;

const int inf=1000000000;

int n,val[n],last[n],w[n],a[n],f[n],g[n],cnt,r[n],two[n],lef[n],rig[n],n1[n],n2[n],t1[n],t2[n];

struct edgee[n*2];

bool vis[n];

intread()

while (ch>='0'&&ch<='9')

return

x*f;

}void addedge(int u,int v)

int solve(int a1,int

x) r[1]=min(r[1],rig[tmp]);r[tot]=min(r[tot],lef[tmp]);

w[1]=inf;

for (int i=1;i<=tot;i++) f[i]=min(f[i-1]+min(r[i],w[i]),g[i-1]+w[i]),g[i]=f[i-1];

return f[tot];

}int get(int a1)

int main()

int ans=0;

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

if (!vis[i])

else

}for (int j=last[now];j;j=e[j].next)

if (!vis[e[j].to])

}ans+=get(a1);

}printf("%d",ans);

return

0;}

51nod 1321 收集點心(最小割)

給出一種最小割的方法。設 num1 i num2 i 為第i種形狀的點心的兩種口味的數量 設 type i type i 為第i種形狀的點心的兩種口味 假設 num1 i 考慮幾種最優的購買方案 1.買 num1 i 1 個點心。這樣一定可以得到 type2 i 2.買 num2 i 1 個點心。這...

51Nod 四點共面

1265 四點共面 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出三維空間上的四個點 點與點的位置均不相同 判斷這4個點是否在同乙個平面內 4點共線也算共面 如果共面,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 ...

51nod1265四點共面

原題鏈結 四點共面即以某點指向其它三點的向量的混合積為0 如下 include include include include include include include include include include include include define ll long long us...