题意 有两个人想去一起看电影,然后分别给出两个人 分别喜欢看的电影都在哪些天 然后 同一个人 不能连续看两天他不喜欢的电影 求他们最多可以看多少次电影
思路 先将两人喜欢看的电影进行排序, ① 选择两个人中喜欢看的电影中的天数次序小的进行观看 ②标记FLAG 看了一个人的 下次选择另一个人的 ③如果另一个人喜欢看的电影的天数次序大于上次那个人的天数次序 则返回② ④如果一个人喜欢看的电影的天数次序等于上次那个人的天数次序 则返回② 跳出循环条件 ① 两个人的电影都选完了 则直接BREAK ② 两个人的电影其中一个选完,另一个人还有的选,则ANS + 1 再BREAK
AC代码
#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <climits> #include <iostream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> using namespace std; typedef long long ll; typedef long double ld; typedef pair <int, int> pii; typedef pair <ll, ll> pll; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; int p[maxn], q[maxn]; int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &p[i]); sort (p, p + n); int m; scanf("%d", &m); for (int i = 0; i < m; i++) scanf("%d", &q[i]); sort(q, q + m); int flag; int vis = -1; int i = 0, j = 0; int ans = 0; while (1) { if (vis == -1) { if ((i == n && j != m) || (i != n && j == m)) { ans++; break; } else if (i == n && j == m) break; if (p[i] < q[j]) { vis = p[i]; ans++; i++; flag = 1; continue; } else if (p[i] == q[j]) { ans++; i++; j++; continue; } else { vis = q[j]; j++; ans++; flag = 0; continue; } } else if(flag == 0) { if (i == n) break; for ( ; i < n; i++) { if (p[i] > vis) { vis = p[i]; i++; ans++; flag = 1; break; } else if(p[i] == vis) { vis = -1; i++; break; } } } else if (flag == 1) { if (j == m) break; for ( ; j < m; j++) { if (q[j] > vis) { vis = q[j]; j++; ans++; flag = 0; break; } else if(q[j] == vis) { vis = -1; j++; break; } } } } cout << ans << endl; }转载于:https://www.cnblogs.com/Dup4/p/9433240.html
相关资源:JAVA上百实例源码以及开源项目