2176-For the Peace

問題概要

テキストエディタがフリーズして詰んだので画像で

解法

あるミサイルを撤去しても条件を満たすなら撤去する.
ミサイルが一つも撤去出来なくなったら終了する.

実装(C++)

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <queue>
using namespace std;
int n,d,m,sum[101];
vector<int> missile[100];
int main() {
	for(;cin>>n>>d;){
		if(n==0)break;
		fill(sum,sum+n+1,0);
		for(int i=0;i<n;i++){
			cin>>m;
			missile[i]=vector<int>(m);
			for(int j=0;j<m;j++)cin>>missile[i][j];
			sum[i]=accumulate(missile[i].begin(),missile[i].end(),0);
		}
		bool ok=true;
		while(1){
			int M=max_element(sum,sum+n)-sum;
			int MV=sum[M];
			if(MV==0)break;
			int cnt=0;
			for(int i=0;i<n;i++){
				while(!missile[i].empty()){
					sum[i]-=missile[i].back();
					if(abs(sum[max_element(sum,sum+n)-sum]-sum[i])>d){
						sum[i]+=missile[i].back();
						break;
					}
					missile[i].pop_back();
					cnt++;
				}
			}
			if(cnt==0){
				ok=false;
				break;
			}
		}
		cout<<(ok?"Yes":"No")<<endl;
	}
}