AtCoderのabc001_4でつまづいています。
具体的には、途中の工程の二次元配列の処理の仕方で、重複する値を削除した配列を表示したいです。
実際の問題では以下の部分です。
「2つ以上のメモに書かれていた感雨時刻が重複した場合、1つの連続した雨とみなす。」
ソースコードは、AtCoderの問題の入力と出力とは若干違うものになっています。
https://atcoder.jp/contests/abc001/tasks/abc001_4
my_delete関数に、値の入った二次元配列と空の二次元配列を渡して、空の二次元配列に重複を削除した値を入れたいです。
ソースコードの空の二次元配列の渡し方も、これだと「0-0」が残ってしまうと思っています。
もっとスマートなやり方ありましたら違う方法でもかまいません。
どのようにループを回せばいいのか、添字を書けばいいのか、からちょっとわからない状況です。
どうぞよろしくお願いいたします。
該当のソースコード
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4void my_delete(vector<vector<int>> &T1, vector<vector<int>> &T2) { 5 T2.at(0).at(0) = T1.at(0).at(0); 6 for(int i = 0; i < T1.size(); i++) { 7 } 8} 9 10void my_sort(vector<vector<int>> &T) { 11 for(int i = 0; i < T.size() - 1; i++) { 12 for(int j = T.size() - 1; j > i; j--) { 13 if(T.at(j).at(0) < T.at(j - 1).at(0)) { 14 int tmp = T.at(j).at(0); 15 T.at(j).at(0) = T.at(j - 1).at(0); 16 T.at(j - 1).at(0) = tmp; 17 tmp = T.at(j).at(1); 18 T.at(j).at(1) = T.at(j - 1).at(1); 19 T.at(j - 1).at(1) = tmp; 20 } 21 } 22 } 23} 24 25int my_round(int x, int m) { 26 string s = to_string(x); 27 if(s.at(3) == '0') { 28 return atoi(s.c_str()); 29 } 30 31 if(m == 0) { 32 s.at(3) = '0'; 33 } else { 34 s.at(3) = '5'; 35 } 36 return atoi(s.c_str()); 37} 38 39int main() { 40 int N = 3; 41 vector<string> SE = {"1106-1123", "1129-1203", "1148-1210"}; 42 43 for(int i = 0; i < N; i++) { 44 cout << SE.at(i) << endl; 45 } 46 vector<vector<int>> T(N, vector<int>(2)); 47 for(int i = 0; i < N; i++) { 48 string tmp; 49 tmp = SE.at(i).at(0); 50 tmp += SE.at(i).at(1); 51 tmp += SE.at(i).at(2); 52 tmp += SE.at(i).at(3); 53 T.at(i).at(0) = atoi(tmp.c_str()); 54 T.at(i).at(0) = my_round(T.at(i).at(0), 0); 55 56 tmp = SE.at(i).at(5); 57 tmp += SE.at(i).at(6); 58 tmp += SE.at(i).at(7); 59 tmp += SE.at(i).at(8); 60 T.at(i).at(1) = atoi(tmp.c_str()); 61 T.at(i).at(1) = my_round(T.at(i).at(1), 5); 62 } 63 64 my_sort(T); 65 66 cout << "output:" << endl; 67 for(int i = 0; i < N; i++) { 68 cout << T.at(i).at(0) << '-' << T.at(i).at(1) << endl; 69 } 70 71 vector<vector<int>> ans(N, vector<int>(2)); 72 my_delete(T, ans); 73 74 cout << "ans:" << endl; 75 for(int i = 0; i < N; i++) { 76 cout << ans.at(i).at(0) << '-' << ans.at(i).at(1) << endl; 77 } 78 79 return 0; 80}
期待する出力
数値を時刻として、続いている間の時刻を一つにまとめて表示したいです。
1106-1123 1129-1203 1148-1210 output: 1100-1125 1120-1205 1140-1210 ans: 1100-1210
丸めの関数を修正したコード
AtCoderの問題の丸め方が間違えているとのご指摘を受けて、自分で考えた関数です。
c++
1string my_round_start(string s) { 2 if(s.at(3) == '0' || s.at(3) == '1' || s.at(3) == '2' || s.at(3) == '3' || 3 s.at(3) == '4') { 4 s.at(3) = '0'; 5 } else if(s.at(3) == '5' || s.at(3) == '6' || s.at(3) == '7' || 6 s.at(3) == '8' || s.at(3) == '9') { 7 s.at(3) = '5'; 8 } 9 return s; 10} 11 12string my_round_end(string s) { 13 if(s.at(3) == '0') { 14 s.at(3) = '0'; 15 } else if(s.at(3) == '1' || s.at(3) == '2' || s.at(3) == '3' || 16 s.at(3) == '4' || s.at(3) == '5') { 17 s.at(3) = '5'; 18 } else if(s.at(3) == '6' || s.at(3) == '7' || s.at(3) == '8') { 19 if(s.at(2) == '0') { 20 s.at(2) = '1'; 21 s.at(3) = '0'; 22 } else if(s.at(2) == '1') { 23 s.at(2) = '2'; 24 s.at(3) = '0'; 25 } else if(s.at(2) == '2') { 26 s.at(2) = '3'; 27 s.at(3) = '0'; 28 } else if(s.at(2) == '3') { 29 s.at(2) = '4'; 30 s.at(3) = '0'; 31 } else if(s.at(2) == '4') { 32 s.at(2) = '5'; 33 s.at(3) = '0'; 34 } else if(s.at(2) == '5') { 35 if(s.at(0) == '0' && s.at(1) == '0') { 36 s = "0100"; 37 } else if(s.at(0) == '0' && s.at(1) == '1') { 38 s = "0200"; 39 } else if(s.at(0) == '0' && s.at(1) == '2') { 40 s = "0300"; 41 } else if(s.at(0) == '0' && s.at(1) == '3') { 42 s = "0400"; 43 } else if(s.at(0) == '0' && s.at(1) == '4') { 44 s = "0500"; 45 } else if(s.at(0) == '0' && s.at(1) == '5') { 46 s = "0600"; 47 } else if(s.at(0) == '0' && s.at(1) == '6') { 48 s = "0700"; 49 } else if(s.at(0) == '0' && s.at(1) == '7') { 50 s = "0800"; 51 } else if(s.at(0) == '0' && s.at(1) == '8') { 52 s = "0900"; 53 } else if(s.at(0) == '0' && s.at(1) == '9') { 54 s = "1000"; 55 } else if(s.at(0) == '1' && s.at(1) == '0') { 56 s = "1100"; 57 } else if(s.at(0) == '1' && s.at(1) == '1') { 58 s = "1200"; 59 } else if(s.at(0) == '1' && s.at(1) == '2') { 60 s = "1300"; 61 } else if(s.at(0) == '1' && s.at(1) == '3') { 62 s = "1400"; 63 } else if(s.at(0) == '1' && s.at(1) == '4') { 64 s = "1500"; 65 } else if(s.at(0) == '1' && s.at(1) == '5') { 66 s = "1600"; 67 } else if(s.at(0) == '1' && s.at(1) == '6') { 68 s = "1700"; 69 } else if(s.at(0) == '1' && s.at(1) == '7') { 70 s = "1800"; 71 } else if(s.at(0) == '1' && s.at(1) == '8') { 72 s = "1900"; 73 } else if(s.at(0) == '1' && s.at(1) == '9') { 74 s = "2000"; 75 } else if(s.at(0) == '2' && s.at(1) == '0') { 76 s = "2100"; 77 } else if(s.at(0) == '2' && s.at(1) == '1') { 78 s = "2200"; 79 } else if(s.at(0) == '2' && s.at(1) == '2') { 80 s = "2300"; 81 } else if(s.at(0) == '2' && s.at(1) == '3') { 82 s = "2400"; 83 } 84 } 85 } else if(s.at(3) == '9') { 86 if(s.at(2) == '0') { 87 s.at(2) = '1'; 88 s.at(3) = '0'; 89 } else if(s.at(2) == '1') { 90 s.at(2) = '2'; 91 s.at(3) = '0'; 92 } else if(s.at(2) == '2') { 93 s.at(2) = '3'; 94 s.at(3) = '0'; 95 } else if(s.at(2) == '3') { 96 s.at(2) = '4'; 97 s.at(3) = '0'; 98 } else if(s.at(2) == '4') { 99 s.at(2) = '5'; 100 s.at(3) = '0'; 101 } else if(s.at(2) == '5') { 102 if(s.at(0) == '0' && s.at(1) == '0') { 103 s = "0100"; 104 } else if(s.at(0) == '0' && s.at(1) == '1') { 105 s = "0200"; 106 } else if(s.at(0) == '0' && s.at(1) == '2') { 107 s = "0300"; 108 } else if(s.at(0) == '0' && s.at(1) == '3') { 109 s = "0400"; 110 } else if(s.at(0) == '0' && s.at(1) == '4') { 111 s = "0500"; 112 } else if(s.at(0) == '0' && s.at(1) == '5') { 113 s = "0600"; 114 } else if(s.at(0) == '0' && s.at(1) == '6') { 115 s = "0700"; 116 } else if(s.at(0) == '0' && s.at(1) == '7') { 117 s = "0800"; 118 } else if(s.at(0) == '0' && s.at(1) == '8') { 119 s = "0900"; 120 } else if(s.at(0) == '0' && s.at(1) == '9') { 121 s = "1000"; 122 } else if(s.at(0) == '1' && s.at(1) == '0') { 123 s = "1100"; 124 } else if(s.at(0) == '1' && s.at(1) == '1') { 125 s = "1200"; 126 } else if(s.at(0) == '1' && s.at(1) == '2') { 127 s = "1300"; 128 } else if(s.at(0) == '1' && s.at(1) == '3') { 129 s = "1400"; 130 } else if(s.at(0) == '1' && s.at(1) == '4') { 131 s = "1500"; 132 } else if(s.at(0) == '1' && s.at(1) == '5') { 133 s = "1600"; 134 } else if(s.at(0) == '1' && s.at(1) == '6') { 135 s = "1700"; 136 } else if(s.at(0) == '1' && s.at(1) == '7') { 137 s = "1800"; 138 } else if(s.at(0) == '1' && s.at(1) == '8') { 139 s = "1900"; 140 } else if(s.at(0) == '1' && s.at(1) == '9') { 141 s = "2000"; 142 } else if(s.at(0) == '2' && s.at(1) == '0') { 143 s = "2100"; 144 } else if(s.at(0) == '2' && s.at(1) == '1') { 145 s = "2200"; 146 } else if(s.at(0) == '2' && s.at(1) == '2') { 147 s = "2300"; 148 } else if(s.at(0) == '2' && s.at(1) == '3') { 149 s = "2400"; 150 } 151 } 152 } 153 return s; 154}
回答1件
あなたの回答
tips
プレビュー