ログインしてください。
公式
D - チームビルディング / Team Building 解説
by
発展的内容1
D - チームビルディング / Team Building 解説
by
physics0523
発展的内容1
C++ の next_permutation を活用することで、 \(N\) 個の候補から \(K\) 個を取り出す行為を実装できます。
具体的には \(N-K\) 個の \(0\) 、 \(K\) 個の \(1\) をこの順に並べた列から始めて next_permutation を回すと所望の結果が得られます。
実装例 (C++):
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
ll N,M,K;
cin >> N >> M >> K;
vector<ll> A(N);
for(auto &nx : A){cin >> nx;}
vector<ll> U(M),V(M),B(M);
for(ll i=0;i<M;i++){
cin >> U[i] >> V[i] >> B[i];
U[i]--; V[i]--;
}
vector<ll> fl(N,0);
for(ll i=1;i<=K;i++){fl[N-i]=1;}
ll best=-8e18;
do{
ll current=0;
for(ll i=0;i<N;i++){
if(fl[i]){current+=A[i];}
}
for(ll i=0;i<M;i++){
if(fl[U[i]]>0 && fl[V[i]]>0){
current-=B[i];
}
}
best=max(best,current);
}while(next_permutation(fl.begin(),fl.end()));
cout << best << "\n";
return 0;
}
投稿日時:
最終更新:
