首页 > 代码库 > Codeforces Round #268 (Div. 1) solution

Codeforces Round #268 (Div. 1) solution

A.24 Game

题意:给你1, 2, ..., n-1, n 这个序列,每次你可以取出两个数做+/-/*三种操作之一,然后把结果放回到序列中,询问能否是的这个序列最后只剩下一个24。

解法:首先很明显n < 4的时候是无解的。如果n=4,那么1 * 2 * 3 * 4=24,如果n=5,那么(5 - 1 - 2) * 3 * 4 = 24。若n > 5,那么我可以做n - (n - 1) = 1,相当于变成了n-2时候的情况加一个1,那么显然最后让答案乘上这个1即可。
代码:
include <cstdio>#include <algorithm>#include <map>#include <vector>#include <string>#include <cstring>using namespace std;const int N = 500010;int a[N];int main() {    int n;    while( scanf("%d", &n) != EOF ) {        if(n <= 3) { printf("NO\n"); continue; }        else if(n % 2 == 0) {            printf("YES\n");            int k = 0;            for(int i = 5; i < n; i += 2) {                printf("%d - %d = 1\n", i + 1, i);                k++;            }            printf("1 * 2 = 2\n");            printf("2 * 3 = 6\n");            printf("6 * 4 = 24\n");            for(int i = 0; i < k; i++) printf("1 * 24 = 24\n");        } else {            printf("YES\n");            int k = 0;            for(int i = 6; i < n; i += 2) {                printf("%d - %d = 1\n", i + 1, i);                k++;            }            printf("5 - 1 = 4\n");            printf("4 - 2 = 2\n");            printf("2 * 3 = 6\n");            printf("6 * 4 = 24\n");            for(int i = 0; i < k; i++) printf("1 * 24 = 24\n");        }    }    return 0;}
View Code

 

B.Two Sets

题意:给你一列两两不同的数v[i],然后两个正整数a,b,现在希望把序列v中的每个数都分到两个集合中的一个。假设两个集合为s,t,那么若x∈s,则a-x∈s,类似的有若x∈t,则b-x∈t。询问这列数能否被成功划分到两个集合。

解法:首先我们假设a<b。我们考虑现在这列数中最小的数,假设为x。若b-x在序列v中存在,那么我一定会把x和b-x都放到集合t中。因为如果我不把b-x和x放到t中,那么b-x这个元素就永远无法被任何其他的元素匹配了。原因是假设又另一个元素能和b-x匹配,我们设这个元素为y,由于x是当前序列中的最小值,那么y>x,则有y+b-x>b,那么显然和y+b-x=b矛盾。然后还需要考虑的就是有可能2 * x = a或 2 * x = b,这种特殊考虑一下就好了。呃,我的代码由于没想清楚写的比较复杂,思路也不完全是上述的思路,仅供参考。
代码:
#include <cstdio>#include <algorithm>#include <map>#include <vector>#include <string>#include <set>#include <cstring>using namespace std;const int N = 100010;int v[N];map<int, int> mp;set<int> s;set<int>::iterator it, is, ir;int main() {    int n, a, b;    while( scanf("%d%d%d", &n, &a, &b) != EOF ) {        int oo = 0;        if(a > b) { swap(a, b); oo = 1; };        s.clear();        mp.clear();        for(int i = 0; i < n; i++) {            scanf("%d", &v[i]);            s.insert(v[i]);        }        int flag = 0;        for(it = s.begin(); s.size() > 0; it = s.begin()) {            int p1 = *it;            is = s.find(a - p1);            if(2 * p1 == a) {                is = s.find(b - p1);                if(is != s.end()) {                    s.erase(p1);                    s.erase(b - p1);                    mp[p1] = 1;                    mp[b - p1] = 1;                } else {                    s.erase(p1);                    mp[p1] = 0;                }            } else if(2 * p1 == b){                s.erase(p1);                mp[p1] = 1;            }else if(is == s.end()) {                is = s.find(b - p1);                if(is == s.end()) {                    if(2 * p1 == b) {                        s.erase(p1);                        mp[p1] = 1;                    } else {                        flag = 1;                        break;                    }                } else {                    s.erase(b - p1);                    s.erase(p1);                    mp[b - p1] = 1;                    mp[p1] = 1;                }            } else {                is = s.find(b - p1);                if(is == s.end()) {                    if(a - p1 == p1) {                        flag = 1;                        break;                    }                    s.erase(a - p1);                    s.erase(p1);                    mp[a - p1] = 0;                    mp[p1] = 0;                } else {                    is = s.find(b - a + p1);                    if(is == s.end()) {                        s.erase(a - p1);                        s.erase(p1);                        mp[a - p1] = 0;                        mp[p1] = 0;                    } else{                        s.erase(b - p1);                        s.erase(p1);                        mp[b - p1] = 1;                        mp[p1] = 1;                        s.erase(a - p1);                        s.erase(b - a + p1);                        mp[a - p1] = 1;                        mp[b - a + p1] = 1;                    }                }            }        }        if(flag == 1) printf("NO\n");        else {            printf("YES\n");            for(int i = 0; i < n; i++) printf("%d%c", (mp[v[i]] ^ oo), (i == (n - 1))?\n: );        }    }    return 0;}
View Code

 

Codeforces Round #268 (Div. 1) solution