codeforces 515B. Drazil and His Happy Friends 解题报告

题目链接:http://codeforces.com/problemset/problem/515/B

题目意思:有 n 个 boy 和 m 个 girl,有 b 个 boy 和 g 个 girl (通过给出数组下标)是 happy的,规定每轮 dinner 中,派出编号为 i mod n 个男 和 i mod m 个女去。只要他们其中一个为 happy 时,另一个也会变得 happy,问最终所有男女是否都变得 happy。

  一步一步模拟就可以了。这个问题有一个难点,就是究竟要进行多少次才能判断有些男女无论如何都不会happy的。由于数据量不大,只有100。最坏的情况就是每一个男女都有机会组合,所以 100 * 100 次来控制次数就可以了。每次配完对都检查下是否每个男女都已经为 happy,以便尽早结束循环,不要再进行无谓的组合。

  开 virtual 做的,发现,为什么B比C更加少人做出来。。。(C是完全木有思路 - -)

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int maxn = 100 + 5;
 8 int boy[maxn], girl[maxn];
 9 int n, m;
10
11 int main()
12 {
13     #ifndef ONLINE_JUDGE
14         freopen("in.txt", "r", stdin);
15     #endif // ONLINE_JUDGE
16
17     int b, g;
18     while (scanf("%d%d", &n, &m) != EOF) {
19         memset(boy, 0, sizeof(boy));
20         memset(girl, 0, sizeof(girl));
21
22         int in;
23         scanf("%d", &b);
24         for (int i = 0; i < b; i++) {
25             scanf("%d", &in);
26             boy[in] = 1;
27         }
28         scanf("%d", &g);
29         for (int i = 0; i < g; i++) {
30             scanf("%d", &in);
31             girl[in] = 1;
32         }
33         bool flag;
34         int stb = 0, stg = 0;
35         int cnt = maxn*maxn;
36         while (cnt) {
37             flag = true;
38             stb %= n;
39             stg %= m;
40             if (boy[stb] || girl[stg]) {   // 其中一个是happy的
41                 boy[stb] = 1;
42                 girl[stg] = 1;
43             }
44             // 检查男女两边是否都已经happy
45             for (int i = 0; i < n; i++) {
46                 if (!boy[i]) {
47                     flag = false;
48                     break;
49                 }
50             }
51             for (int i = 0; i < m; i++) {
52                 if (!girl[i]) {
53                     flag = false;
54                     break;
55                 }
56             }
57             if (flag)
58                 break;
59             stb++;
60             stg++;
61             cnt--;
62         }
63         printf("%s\n", flag ? "Yes" : "No");
64     }
65     return 0;
66 }
时间: 2024-10-12 19:50:24

codeforces 515B. Drazil and His Happy Friends 解题报告的相关文章

Codeforces Round #615(Div.3)解题报告

Codeforces Round #615(Div.3)解题报告 A. Collecting Coins 注意\(n\)可能不够用的情况. #include<bits/stdc++.h> using namespace std; typedef long long ll; int a, b, c, n; void solve() { cin >> a >> b >> c >> n; int mx = max(max(a, b), c); int

codeforces 515B.Drazil and His Happy Friends

B. Drazil and His Happy Friends time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Drazil has many friends. Some of them are happy and some of them are unhappy. Drazil wants to make all his f

codeforces 558B. Amr and The Large Array 解题报告

题目链接:http://codeforces.com/problemset/problem/558/B 题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值. 由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值.因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数.然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值. 赛中短路竟然想不出来~~~泪啊~~泪啊- >_< 1 #include <io

codeforces 514B. Han Solo and Lazer Gun 解题报告

题目链接:http://codeforces.com/problemset/problem/514/B 题目意思:给出双头枪的位置(x0, y0),以及 n 个突击队成员的坐标.双头枪射击一次,可以把它对住的方向(是直线,不是射线,因为是双头嘛)所有的人射杀掉.问将所有突击队成员消灭的最少射击数是多少. 首先要清楚的是,双头枪可以瞄准的方向是无限的,所以通过枚举所有方向是不现实的!方向其实就是对应斜率,但是没有理由把函数求出然后将士兵的位置一个一个代入来做吧---所以呢,直接求 k 就可以了,k

Codeforces Round #306 (Div. 2) D.E. 解题报告

D题:Regular Bridge 乱搞.构造 这题乱搞一下就行了.构造一个有桥而且每个点的度数都为k的无向图.方法很多,也不好叙述.. 代码如下: #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <map> #include <algorithm> #define INF 0x

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

codeforces 505A. Mr. Kitayuta&#39;s Gift 解题报告

题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串. /**************************************(又到自我反省时刻) 做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文.但是由于

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces 515C. Drazil and Factorial

//codeforces 515C. Drazil and Factorial #include <iostream> #include <cstring> #include <cstdio> using namespace std; /** 4!=2!*2!*3! 6!=1*2*3*4*5*6=5!*3! 8!=1*2*3*4*5*6*7*8=7!*2!*2!*2! 9!=1*2*3*4*5*6*7*8*9=7!*2!*3!*3! */ int main() { ch