解法
全探する。考えられる組み合わせをすべて挙げればいい感じにできる。
できるだけライオンを檻の中に多く入れたいので、あんな感じ(以下ソース参照)に檻に入れられる最大値からループを回す。
ソース
#include<iostream> using namespace std; int n, x, m, l[10], r[10], s[10]; int ret[6]; bool rec( int now, int sum){ if(now == n){ int sum[6] = {}; for(int i = 0 ; i < n ; i++){ sum[i + 1] = sum[i] + ret[i]; } for(int i = 0 ; i < m ; i++ ){ if(sum[r[i]] - sum[l[i] - 1] != s[i]) return false; } for(int i = 0 ; i < n ; i++ ){ cout << (i ? " " : "") << ret[i]; } cout << endl; return true; } for(int i = x ; i >= 0 ; i--){ ret[now] = i; if(rec( now + 1, sum - i)) return true; } return false; } int main(){ cin >> n >> x >> m; for(int i = 0; i < m; i++){ cin >> l[i] >> r[i] >> s[i]; } if(!rec(0,m)) cout << "-1\n"; }
0 件のコメント:
コメントを投稿