前提・実現したいこと
https://atcoder.jp/contests/abc111/tasks/arc103_a
この問題をときたいです。
youtubeの解説放送は以下の動画のおおよそ26:27~です
https://www.youtube.com/watch?v=fYS-rAUSD5o&t=1927s
※C言語の文法がわからないとかではないです
発生している問題・エラーメッセージ
エラーは出ません。 サンプル以外のテストケース全てで間違いとされます。 テストケースがわからないので、こういうときにこのコードだとまずいよ というケースを教えていただけると幸いです。 シンプルにおかしいところでも構いません。
該当のソースコード
#include<stdio.h> #include<stdlib.h> int frequency(int idx, int n, int* pv, int Arr[][2]){ int tmp = pv[0]; int idxDarr = 0; int cnt = 0; while(idx < n){ if(tmp != pv[idx]){ idxDarr++; cnt = 1; Arr[idxDarr][0] = pv[idx]; Arr[idxDarr][1] = cnt; tmp = pv[idx]; }else{ Arr[idxDarr][0] = pv[idx]; cnt++; Arr[idxDarr][1] = cnt; } idx += 2; } if(idx == 0) return 0; else return 1; } int compDown(const void* a, const void* b){ int* pa = (int*)a; int* pb = (int*)b; return *(pb+1) - *(pa+1); } int main(void){ int n; scanf("%d", &n); int v[n]; for(int i = 0; i < n; i++){scanf("%d", &v[i]);} int oddTrg, evenTrg; int oddArr[n/2][2]; int evenArr[n/2][2]; for(int i = 0; i < n/2; i++){for(int j = 0; j < 2; j++){oddArr[i][j] = 0;}} for(int i = 0; i < n/2; i++){for(int j = 0; j < 2; j++){evenArr[i][j] = 0;}} //奇数番目、偶数番目それぞれの、数字とその個数の二次元配列をつくる int oddNum = frequency(0, n, v, oddArr); int evenNum = frequency(1, n, v, evenArr); //個数の大きい順に並び替える qsort(oddArr, n/2, 2*sizeof(int), compDown); qsort(evenArr, n/2, 2*sizeof(int), compDown); //並び替えれてるかのチェックに使う /*for(int i = 0; i < n/2; i++){for(int j = 0; j < 2; j++){printf("%d ", oddArr[i][j]);}printf("\n");} printf("----------\n"); for(int i = 0; i < n/2; i++){for(int j = 0; j < 2; j++){printf("%d ", evenArr[i][j]);}printf("\n");}*/ int ans = -1;; //数字の種類が1種類の時の処理も書かないといけなさそう if(oddNum == 0 && evenNum == 0){ if(oddArr[0][0] == evenArr[0][0]){ans = n/2;} else{ans = 0;} } else if((oddNum == 1) && (evenNum == 0)){ //ans = n/2; if(oddArr[0][0] == evenArr[0][0]){ans = n/2 - oddArr[1][1];} else{ans = n/2 - oddArr[0][1];} } else if((oddNum == 0) && (evenNum == 1)){ //ans = n/2; if(oddArr[0][0] == evenArr[0][0]){ans = n/2 - evenArr[1][1];} else{ans = n/2 - evenArr[0][1];} } //数字の種類が奇数番目偶数番目共に2種類以上の時用の処理 if(ans == -1){ if(oddArr[0][0] != evenArr[0][0]){ ans = n - (oddArr[0][1]+evenArr[0][1]); } else{ if(oddArr[0][1] > evenArr[0][1]){ ans = n - (oddArr[0][1] + evenArr[1][1]); } else if(oddArr[0][1] == evenArr[0][1]){ if(oddArr[1][1] >= evenArr[1][1]){ ans = n - (oddArr[1][1] + evenArr[0][1]); }else{ ans = n - (oddArr[0][1] + evenArr[1][1]); } } else{ ans = n - (oddArr[1][1]+evenArr[0][1]); } } } printf("%d\n", ans); return 0; }
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/05/06 06:56
退会済みユーザー
2019/05/06 07:38
2019/05/06 07:40