티스토리 뷰

https://www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const N = +n;


let player = []; 
for(let i =0; i<N; i++){
    player.push(i);
}



let stats = arr.map(v=>v.split(' ').map(v=>+v))
let diff = 1000;


solve();
console.log(diff)

function countBits(value){ 
    let count  = 0; 
    while(value>0){ 
      if((value&1)==1) count++; 
      value = value>>1; 
    }
    return count; 
  }
  
  function solve(){ 
    const team = [];
    for( let i  = 0; i<(1<<N); i++){ 
      if(countBits(i)==N/2){ 
        let temp =[]; 
        for( let j=0; j<N; j++){ 
          if(i&(1<<j)) temp.push(j); 
        }
        team.push(temp);
      }
    }
    team.forEach(v=>{
        if(calcDiff(v)<diff) diff = calcDiff(v);
    })

}






function startTeam(arr){
    let sum = 0;
    for(let i = 0; i<arr.length; i++){
        for(let j = 0; j<arr.length; j++){
            sum+=stats[arr[i]][arr[j]];
        }
    }
    return sum
}

function linkTeam(arr){
    let linkArr = player.filter(v=>!arr.includes(v))
    let sum = 0;
    for(let i = 0; i<linkArr.length; i++){
        for(let j = 0; j<linkArr.length; j++){
            sum+=stats[linkArr[i]][linkArr[j]];
        }
    }
    return sum
}

function calcDiff(arr){
    return Math.abs(startTeam(arr)-linkTeam(arr))
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함