标签:style blog http color io os ar for div
A.24 Game
题意:给你1, 2, ..., n-1, n 这个序列,每次你可以取出两个数做+/-/*三种操作之一,然后把结果放回到序列中,询问能否是的这个序列最后只剩下一个24。
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; }
B.Two Sets
题意:给你一列两两不同的数v[i],然后两个正整数a,b,现在希望把序列v中的每个数都分到两个集合中的一个。假设两个集合为s,t,那么若x∈s,则a-x∈s,类似的有若x∈t,则b-x∈t。询问这列数能否被成功划分到两个集合。
#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; }
Codeforces Round #268 (Div. 1) solution
标签:style blog http color io os ar for div
原文地址:http://www.cnblogs.com/shiina-mashiro/p/3984024.html