Cod sursa(job #1709471)

Utilizator ubb_oprimabuzurile_2016UBB - OprimAbuzurile2016 - Petru Bianca Cosmin ubb_oprimabuzurile_2016 Data 28 mai 2016 12:26:47
Problema Sate2 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <cstdio>
#include <ctime>
#define LL long long
#define x first
#define y second
#define mp make_pair
#define DN 100005
#define ITER 2000023
using namespace std;

typedef pair<int,int> per;

int t,n,m,k,sum[4];
vector<vector<int> > v;

int main() {
  //ifstream f("input.txt");
  ifstream f("sate2.in");
  ofstream g("sate2.out");
  srand(time(NULL));
  for(f>>t;t--;) {
    f>>n>>m>>k;
    v.resize(k);
    string r="NU";
    for(int i=0; i<k; ++i) {
      sum[i]=0;
      v[i].clear();
    }
    for(int i=0; i<n; ++i) {
      int x,im; f>>x;
      for(int i=1; i<k; ++i) if(sum[i]<sum[im]) im=i;
      sum[im]+=x;
      v[im].push_back(x);
    }
    for(int _i=0; _i<=ITER; ++_i) {
      int im=0,iM=0;
      for(int i=0; i<k; ++i) {
        if(sum[i]<sum[im]) im=i;
        if(sum[i]>sum[iM]) iM=i;
      }
      if(rand()%2 && v[iM].size() && v[im].size()) {//mut din min in max
        int pm=rand()%v[im].size(),pM=rand()%v[iM].size();
        sum[im]-=v[im][pm]; sum[im]+=v[iM][pM];
        sum[iM]-=v[iM][pM]; sum[iM]+=v[im][pm];
        swap(v[im][pm],v[iM][pM]);
      }else {
        sum[iM]-=v[iM].back(); sum[im]+=v[iM].back();
        v[im].push_back(v[iM].back()); v[iM].pop_back();
      }
      int b=1;
      for(int i=1; i<k; ++i) if(sum[i]!=sum[i-1]) b=0;
      if(b) r="DA";
    }
    g<<r<<'\n';
  }
}