[ブルーブリッジカップ]試験トレーニング2013C ++ Aグループ質問7間違ったメモ

 間違ったチケット

問題の説明
秘密関連のユニットが特定の種類の請求書を発行し、彼らは年末にそれらをすべて撤回しなければなりませんでした。

各チケットには一意のID番号があります。年間を通してすべての請求書のID番号は連続していますが、IDの開始番号はランダムに選択されます。

スタッフの過失により、ID番号の入力時にエラーが発生し、1つのIDの番号が不足し、別のIDが重複しました。

あなたの仕事は、プログラミングを通して壊れた番号のIDと繰り返された番号のIDを見つけることです。

壊れた数が最大数と最小数で発生することはないと仮定します。

入力形式
プログラムは、データ行数を示す整数N(N <100)を入力する必要があります。

次に、N行のデータを読み込みます。

データの各行の長さは異なります。これは、スペースで区切られた数(100以下)の正の整数(100000以下)です。行の中および最後に余分なスペースがある場合があることに注意してください。プログラムこれらのスペースを処理できる必要があります。

各整数はID番号を表します。

出力形式
プログラムは、スペースで区切られた2つの整数mnを含む1行を出力する必要があります。

これらの中でも、Mが壊れIDを表し、nはIDの繰り返しを表す
サンプル入力1
2
5 6 8 11 9
10 12 9
の出力例1
7 9
サンプル入力2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
サンプル出力2
105 120

 

問題分析

C ++でのこの質問の主な難しさは、複数行の入力、改行文字の処理(getchar()が少なくてはならない)、出力文字列の分割(c ++は分割関数を記述しない)など、複数の文字列の処理にあります。自分で実装する必要があります)、文字列を整数に変換します(s2i()テンプレート)

入力された分割数を配列に格納します。配列のサイズは、質問の意味に応じて割り当てられ、格納後に並べ替えられるため、順序付けられた数値のシーケンスを取得できます。ブレークポイント現象は、差が2と差は0です。繰り返されます。配列をループするとき、配列が範囲外になるのを避けるために、iは1から始まることに注意してください-(i-1)

見落としがちなのは、タイトルには出力フォーマットが必要だということです1行、m、スペース、n、つまりブレークポイントの数、スペースの数、繰り返しの数。このとき、前の検索プロセスで取得した数を変数で保存するのが最善です。

#include <iostream>
#include <sstream>
#include <algorithm> 
using namespace std;

int line;
const int maxN = 10000;
int data[maxN];

void s2i(string &str, int &num){
	stringstream ss;
	ss << str;
	ss >> num;
}

int main(int argc, char** argv) {
	scanf("%d", &line);
	getchar();		//去掉换行符,一定不能少 
	int index = 0;
	for(int i = 0; i < line; i++){
		string s;
		getline(cin, s); 
		istringstream iss(s);
		string tmp;
		
		while(getline(iss, tmp, ' ')){
			s2i(tmp, data[index]);
			index++;		
		}
	} 
//	cout << index ;
	
	//排序
	sort(data, data+index);
	int a, b; 
	//应该用变量记录下来断点和重复的数,因为并不知道断点和重复哪一个在前 
	//而题目要求先输出断点,后输出重复的数 
	for(int i = 1; i < index; i++){
		if(data[i] - data[i-1] == 2){	//断序的 
//			cout << data[i]-1 << endl;	//扣分 
			a = data[i]-1;
		}
		if(data[i] == data[i-1]){		//重复的 
//			cout << data[i] << endl;	//扣分 
			b = data[i];
		}
	}
	
	cout << a << " " << b;
	return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44566432/article/details/115142967