intさわだんのBlack History

刹那的レジェンドになりたい。

JOI本選過去問 第7回 日本情報オリンピック本選 3問目 ダーツ

まず初めに、非常に効率の悪い解法。(O(n^4))

#include <cstdio>
#include <algorithm>

using namespace std;


int n = 0;

long int m = 0;

long int ans = 0;

long int p[1003] = {0};

int main(){

  while(1){


  scanf("%d%ld",&n,&m);

  if(n == 0) break;

  ans = 0;

  for(int i = 0;i < n;i++){
    scanf("%ld",&p[i]);
  }

  sort(p,p+n);




  for(int a = 0;a < n;a++){
    if(p[a] <= m && p[a] > ans) ans = p[a];
    if(p[a] > m) break;


    for(int b = a;b < n;b++){
      long int tmp = p[a] + p[b];
      if(tmp > ans && tmp <= m) ans = tmp;
      if(tmp > m) break;


      for(int c = b;c < n;c++){
	tmp = p[a] + p[b] + p[c];
	if(tmp > ans && tmp <= m) ans = tmp;
	if(tmp > m) break;


	for(int d = c;d < n;d++){
	  tmp = p[a] + p[b] + p[c] + p[d] ;
	  if(tmp > ans && tmp <= m) ans = tmp;
	  if(tmp > m) break;
	}
      }
    }
  }

  printf("%ld\n",ans);

  }


  return 0;

}

次に満点解法といきたかったけどやっぱ寝ます。。。

続きは追記します。