답안 #51322

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51322 2018-06-17T13:19:50 Z KieranHorgan 관광 (NOI14_sightseeing) C++17
0 / 25
4 ms 548 KB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;
#define endl '\n'
#define ll long long
#define int long long
#define ld long double
#define pii pair<int,int>
#define rand() abs((rand()<<15)|rand())
#define randll() abs(((long long)rand()<<30)|rand())

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long seed;
  asm("rdtsc" : "=A"(seed));
  srand(seed);

  int n, m;
  cin >> n >> m;

  if(n == 1) {
    vector<int> grid(m+1, 0);
    int totalOnes = 0;
    for(int i = 1; i <= m; i++) {
      cin >> grid[i];
      if(grid[i])
        totalOnes++;
    }

    int ans = 1ll<<29;
    int carried = totalOnes;
    for(int i = 1; i <= m; i++) {
      if(grid[i] == 1) {
        carried--;
        carried = min(carried, totalOnes-1);
        ans = min(ans, carried);
      } else {
        carried++;
        carried = min(carried, totalOnes+1);
        ans = min(ans, carried);
      }
    }
    cout << ans << endl;
  } else if(n == 2) {
    vector<int> g1(m+1, 0);
    vector<int> g2(m+1, 0);
    int totalOnes = 0;
    int ones1 = 0;
    int ones2 = 0;
    for(int i = 1; i <= m; i++) {
      cin >> g1[i];
      if(g1[i])
        totalOnes++,
        ones1++;
    }
    for(int i = 1; i <= m; i++) {
      cin >> g2[i];
      if(g2[i])
        totalOnes++,
        ones2++;
    }


    int ans = 1ll<<29;
    int carried = ones1;
    for(int i = 1; i <= m; i++) {
      if(g1[i] == 1) {
        carried--;
        carried = min(carried, ones1-1);
        ans = min(ans, carried+ones2);
      } else {
        carried++;
        carried = min(carried, ones1+1);
        ans = min(ans, carried+ones2);
      }
    }
    carried = ones2;
    for(int i = 1; i <= m; i++) {
      if(g2[i] == 1) {
        carried--;
        carried = min(carried, ones2-1);
        ans = min(ans, carried+ones1);
      } else {
        carried++;
        carried = min(carried, ones2+1);
        ans = min(ans, carried+ones1);
      }
    }

    for(int i = 1; i <= m; i++) {
      if(g1[i]==0) g1[i] = -1;
      if(g2[i]==0) g2[i] = -1;
      g1[i] += g2[i];
    }

    carried = totalOnes;
    for(int i = 1; i <= m; i++) {
      if(g1[i] >= 0) {
        carried -= g1[i];
        carried = min(carried, totalOnes-g1[i]);
        ans = min(ans, carried);
      } else {
        carried -= g1[i];
        carried = min(carried, totalOnes-g1[i]);
        ans = min(ans, carried);
      }
    }
    cout << ans << endl;

  }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 248 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 360 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 520 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 548 KB Output isn't correct
2 Halted 0 ms 0 KB -