城市裡有乙個點心店,裡面有許多不同的點心。已知這些點心有以下特點:
(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...