1 条题解
-
0
#include <cmath> #include <cstdio> #include <cstdlib> #include <memory.h> #include <algorithm> #include <vector> #include <deque> using namespace std; namespace dts { typedef long long ll; int n,ans,a[50],num[50],rk[50],sum[50]; ll cf[50]; void qs(int l,int r) { int i=l,j=r; for (int mid=a[(l+r)>>1];i<j;) { while (a[i]>mid) i++; while (a[j]<mid) j--; if (i<=j) { swap(a[i],a[j]); swap(num[i],num[j]); i++,j--; } } if (l<j) qs(l,j); if (i<r) qs(i,r); } void dfs(int pos,ll sta,int cnt) { if (pos<n) { if (cnt+sum[n-1]-sum[pos-1]<=ans) return; if (!(sta&cf[pos])) dfs(pos+1,sta|((ll)1<<pos),cnt+a[pos]); dfs(pos+1,sta,cnt); } ans=max(ans,cnt); } void main() { scanf("%d",&n); for (int i=0;i<n;i++) scanf("%d",&a[i]),num[i]=i; qs(0,n-1); for (int i=0;i<n;i++) rk[num[i]]=i; memset(cf,0,sizeof(cf)); for (int x,y;~scanf("%d%d",&x,&y);) { x--,y--; cf[rk[x]]|=((ll)1<<rk[y]); cf[rk[y]]|=((ll)1<<rk[x]); } sum[0]=a[0]; for (int i=1;i<n;i++) sum[i]=sum[i-1]+a[i]; ans=0; dfs(0,(ll)0,0); printf("%d\n",ans); } } int main() { dts::main(); }
- 1
信息
- ID
- 136
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8.5
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者