题解 | #小球投盒#
小球投盒
https://www.nowcoder.com/practice/e0e8a6f2ba7747b5a9f8a8dc6fa3e9f1
每次 1 操作之后只有两种情况完成目标,同盒子 x 有过 2 操作,或者所有盒子都有过 1 操作
每次 2 操作之后只有两种情况完成目标,同盒子 x 有过 1 操作,或者有其他盒子有过 2 操作
可以使用map维护已经操作过的 1 和 2 操作,注意检查某操作是否存在(某个键是否存在)需要使用 count ,如果直接使用 mp[x]==0 来判断会创建这个元素
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 5; int __t = 1, n, m, k, x; void solve() { cin >> n >> m; map<int, int> mp1, mp2; for (int i = 1; i <= m; ++i) { cin >> k >> x; if (k == 1) { mp1[x] = 1; if (mp2.count(x) || mp1.size() == n) { cout << i << "\n"; return; } } else { mp2[x] = 1; if (mp1.count(x) || mp2.size() > 1) { cout << i << "\n"; return; } } } cout << -1 << "\n"; return; } int32_t main() { #ifdef ONLINE_JUDGE ios::sync_with_stdio(false); cin.tie(0); #endif // cin >> __t; while (__t--) solve(); return 0; }