結果
| 問題 | No.4 おもりと天秤 |
| コンテスト | |
| ユーザー |
ramia777
|
| 提出日時 | 2022-05-19 09:33:30 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,917 bytes |
| コンパイル時間 | 622 ms |
| コンパイル使用メモリ | 92,268 KB |
| 実行使用メモリ | 10,144 KB |
| 最終ジャッジ日時 | 2024-09-17 15:02:29 |
| 合計ジャッジ時間 | 7,465 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 18 TLE * 1 -- * 4 |
ソースコード
//Yukicoder No.4
//重りと天秤
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>
#include <list>//list
#include <set> //tree
#include <map> //連想配列
#include <unordered_set> //hash
#include <unordered_map> //hash
#include <algorithm>
#include <iomanip>
#include <string>
#include <stdlib.h>
using namespace std;
typedef unsigned long long ULL;
typedef signed long long SLL;
typedef unsigned int UINT;
int N;
int W[100];
int possible = 0;
int _target_weight = 0;
//
// 半分の重さになるおもりの組み合わせがあるかを調べる
//
// n:おもりのインデックス
// total_weight:載せた合計の重さ
void func(int n, int total_weight)
{
if (possible)
return;
if (n >= N)
return;
if (_target_weight < total_weight)
return;
if (_target_weight == total_weight)
{
possible = 1;
return;
}
func(n + 1, total_weight + W[n]); //先に n番目を載せた場合を調べる(探索枝を短くするため)
func(n + 1, total_weight); //後から n番目を載せなかった場合を調べる
return;
}
//降順
int compare(const int * a, const int *b)
{
if (*a < *b)
return (1);
else if (*a > *b)
return (-1);
return (0);
}
int main()
{
int total = 0;
cin >> N;
for (int i=0;i<N;i++)
{
cin >> W[i];
total += W[i];
}
if (total % 2)
{
//そもそも2分割できない合計だったらすぐさまimpossibleを返す
cout << "impossible" << endl;
return 0;
}
// 半分に割る
_target_weight = total >> 1;
//降順のソート
qsort(W, N, sizeof(int), (int(*)(const void*, const void*))compare);
//半分の重さになるかを深さ(再帰)探索。重たいものから載せる(探索枝を短くするため)
func(0,0);
if (possible == 1)
{
cout << "possible" << endl;
}
else
{
cout << "impossible" << endl;
}
//getchar();
return 0;
}
ramia777