[programmers]ユニフォーム


質問する


問題の説明

制限I/O例

もんだいぶんせき


まず、ユニフォームを紛失した学生番号->loss
余分なジャージの学生番号->reserve
n名の学生を入力します.
制限事項で盗まれた生徒数は1名以上、n名以下で重複番号はないという.なお、女性用のユニフォームを持参した生徒数は1名以上n名以下であり、重複番号はない.余分な運動服を持っている学生だけが他の運動服を借りることができます.
また,lossとreserveの番号は隣接する学生の番号を同時に貸すしかない.
例えば、2号に余裕があれば、迷子の1号と3号しか貸せません.

トラブルシューティングポリシー


reserveの値を順番にブラウズし、lossでreserveの値を借りるしかないので、passを介してnの値にnを加算し、戻り値を小さくする方法を適用してみましょう.

コード1

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n; int r = 0;
    for(int i = 0;i < lost.size();i++){
        if(lost[i] == reserve[r]-1 || lost[i] == reserve[r]+1) {r++; continue;}
    answer--;
    if(reserve.size() == r) break;
    }
    return answer;
}
まず間違えました.33.3%の正確性しかない.まず、別のテストボックスを回して、これは間違いだと気づきました.

コード2

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n; int i = reserve.size()-1;
    int item = 0;
    while(1){
        if(lost.size() == 0) break;
        item = lost.back(); lost.pop_back();
        if(item+1 == reserve[i] || item-1 == reserve[i]) {i--; continue;}
        answer--;
    }
    return answer;
}
精度の低い16.7.再開します.

コード3

#include <vector>
#include <string>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve)
{
	int answer = 0;
	vector<int> s(n, 1);
	for (auto a : reserve)
		s[a - 1]++;
	for (auto a : lost)
		s[a - 1]--;

	for (int i = 0; i < s.size(); i++)
	{
		if (i != 0 && s[i] == 0)
		{
			if (s[i - 1] == 2)
			{
				s[i]++;
				s[i - 1]--;
				continue;
			}
		}
		if (i != s.size() - 1 && s[i] == 0)
		{
			if (s[i + 1] == 2)
			{
				s[i]++;
				s[i + 1]--;
			}
		}
	}
	for (auto a : s)
		a > 0 ? answer++ : 0;

	return answer;
}
白くて危ない.