• 15.5.5周练


    地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=77192#overview

    密码:acmore

    赛中出了3道,之后又写了俩。

    AZOJ 3591 Nim(Nim博弈)

    题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式)。

    方法是这样的,由于Nim博弈必胜的条件是所有数的抑或值不为0,证明见  点击  ,所以答案就转化为原序列有多少个区间的亦或值为0,用n*(n+1) / 2 减去这个值就可以了。

    而求有多少个区间的亦或值为0,实际上就是求对于亦或值的前缀nim[i],满足nim[i] == nim[j] 的对数,这时只要对nim数组排序就可以算了

    详见代码:题解

     1 #include <map>
     2 #include <set>
     3 #include <stack>
     4 #include <queue>
     5 #include <cmath>
     6 #include <ctime>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 #define INF 0x3f3f3f3f
    16 #define inf (-((LL)1<<40))
    17 #define lson k<<1, L, mid
    18 #define rson k<<1|1, mid+1, R
    19 #define mem0(a) memset(a,0,sizeof(a))
    20 #define mem1(a) memset(a,-1,sizeof(a))
    21 #define mem(a, b) memset(a, b, sizeof(a))
    22 #define FIN freopen("in.txt", "r", stdin)
    23 #define FOUT freopen("out.txt", "w", stdout)
    24 #define rep(i, a, b) for(int i = a; i <= b; i ++)
    25 
    26 template<class T> T CMP_MIN(T a, T b) { return a < b; }
    27 template<class T> T CMP_MAX(T a, T b) { return a > b; }
    28 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
    29 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
    30 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
    31 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
    32 
    33 //typedef __int64 LL;
    34 typedef long long LL;
    35 const int MAXN = 110000;
    36 const int MAXM = 20010;
    37 const double eps = 1e-4;
    38 //LL MOD = 987654321;
    39 
    40 int n, a[MAXN], x, s, w, T;
    41 
    42 int main()
    43 {
    44     while(~scanf("%d", &T)) while(T--) {
    45         cin >> n >> s >> w;
    46         LL ans = (LL)n * (n + 1) / 2;
    47         int g = s;
    48         rep (i, 1, n) {
    49             x = g;
    50             if( x == 0 )    { x = g = w; }
    51             if( g%2 == 0 )  { g = (g/2); }
    52             else            { g = (g/2) ^ w; }
    53             a[i] = a[i - 1] ^ x;
    54             if(a[i] == 0) ans --;
    55         }
    56         sort(a + 1, a + n + 1);
    57         int num = 1;
    58         rep (i, 2, n) {
    59             if(a[i] == a[i - 1]) {
    60                 ans -= num;
    61                 num++;
    62             }
    63             else num = 1;
    64         }
    65         cout << ans << endl;
    66     }
    67     return 0;
    68 }
    View Code

    B: ZOJ 3593 One Person Game (扩展欧几里得)

    正在搞。。。

    C: ZOJ 3594 Sexagenary Cycle

    乱搞。

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <cmath>
     6 #include <cstring>
     7 #define mem0(a) memset(a, 0, sizeof(a))
     8 #define mem1(a) memset(a, -1, sizeof(a))
     9 using namespace std;
    10 
    11 char T1[11][10] = {"Geng", "Xin", "Ren", "Gui", "Jia", "Yi", "Bing", "Ding", "Wu", "Ji"};
    12 char T2[11][10] = {"Xin", "Geng", "Ji", "Wu", "Ding", "Bing", "Yi", "Jia", "Gui", "Ren"};
    13 char D1[13][10] = {"shen", "you", "xu", "hai", "zi", "chou", "yin", "mao", "chen", "si", "wu", "wei"};
    14 char D2[13][10] = {"you", "shen", "wei", "wu", "si", "chen", "mao", "yin", "chou", "zi", "hai", "xu"};
    15 
    16 int N, T;
    17 
    18 int main()
    19 {
    20     //freopen("in.txt", "r", stdin);
    21     while(cin >> T) while(T--) {
    22         cin >> N;
    23         if(N > 0) printf("%s%s
    ", T1[N % 10], D1[N % 12]);
    24         else printf("%s%s
    ", T2[(-N) % 10], D2[(-N) % 12]);
    25     }
    26     return 0;
    27 }
    View Code

    D:没出

    E:ZOJ 3596  Digit Number(DP+BFS)

     http://www.cnblogs.com/gj-Acit/p/4492762.html

      1 #include <map>
      2 #include <set>
      3 #include <stack>
      4 #include <queue>
      5 #include <cmath>
      6 #include <ctime>
      7 #include <vector>
      8 #include <cstdio>
      9 #include <cctype>
     10 #include <cstring>
     11 #include <cstdlib>
     12 #include <iostream>
     13 #include <algorithm>
     14 using namespace std;
     15 #define INF 0x3f3f3f3f
     16 #define inf (-((LL)1<<40))
     17 #define lson k<<1, L, mid
     18 #define rson k<<1|1, mid+1, R
     19 #define mem0(a) memset(a,0,sizeof(a))
     20 #define mem1(a) memset(a,-1,sizeof(a))
     21 #define mem(a, b) memset(a, b, sizeof(a))
     22 #define FIN freopen("in.txt", "r", stdin)
     23 #define FOUT freopen("out.txt", "w", stdout)
     24 #define rep(i, a, b) for(int i = a; i <= b; i ++)
     25 
     26 template<class T> T CMP_MIN(T a, T b) { return a < b; }
     27 template<class T> T CMP_MAX(T a, T b) { return a > b; }
     28 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
     29 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
     30 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
     31 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
     32 
     33 //typedef __int64 LL;
     34 typedef long long LL;
     35 const int MAXN = 110000;
     36 const int MAXM = 20010;
     37 const double eps = 1e-4;
     38 //LL MOD = 987654321;
     39 
     40 int t, n, m, x;
     41 struct Node {
     42     bool vis;
     43     char num;
     44     int pre, cnt;
     45 }s[(1<<10) * 1100];
     46 char ans[110000], d[110000];
     47 
     48 int bfs()
     49 {
     50     queue<int>q;
     51     q.push(0);
     52     while(!q.empty()) {
     53         int head = q.front();q.pop();
     54         rep (i, 0, 9) {
     55             if(head == 0 && i == 0) continue;
     56             int mod = (head % 1000 * 10 + i) % n;
     57             int tail = ((head / 1000) | (1 << i)) * 1000 + mod;
     58             if(s[tail].vis)
     59                 continue;
     60             s[tail].vis = true;
     61             s[tail].num = i + '0';
     62             s[tail].pre = head;
     63             s[tail].cnt = s[head].cnt + ((head / 1000) & (1 << i) ? 0 : 1);
     64             if(s[tail].cnt == m && mod == 0) {
     65                 return tail;
     66             }
     67             if(s[tail].cnt <= m) q.push(tail);
     68         }
     69     }
     70     return 0;
     71 }
     72 
     73 //calc a / b
     74 char* divide(char *a, int len, int b) {
     75     mem0(d);
     76     int i = 0, cur = 0, l = 0;
     77     while(cur < b && i < len) {
     78         cur = cur * 10 + a[i++] - '0';
     79     }
     80     d[l++] = cur / b + '0';
     81     while(i < len) {
     82         cur = cur % b * 10 + a[i++] - '0';
     83         d[l++] = cur / b + '0';
     84     }
     85     return d;
     86 }
     87 
     88 void print(int ed) {
     89     int len = 0;
     90     mem0(ans);
     91     while(ed) {
     92         ans[len++] = s[ed].num;
     93         ed = s[ed].pre;
     94     }
     95     reverse(ans, ans + len);
     96     printf("%s=%d*%s
    ", ans, n, divide(ans, len, n));
     97 }
     98 
     99 int main()
    100 {
    101     //FIN;
    102     while(cin >> t) while(t--) {
    103         cin >> n >> m;
    104         mem0(s);
    105         if( !(x = bfs()) ) {
    106             puts("Impossible");
    107         }
    108         else {
    109             print(x);
    110         }
    111     }
    112     return 0;
    113 }
    View Code

    F:ZOJ 3597 Hit the Target! (线段树扫描线 -- 求矩形所能覆盖的最多点数)

    见博文http://www.cnblogs.com/gj-Acit/p/4493091.html

    G:ZOJ 3598  Spherical Triangle

    不多说,利用法向量计算平面夹角

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <cmath>
     6 #include <cstring>
     7 #define mem0(a) memset(a, 0, sizeof(a))
     8 #define mem1(a) memset(a, -1, sizeof(a))
     9 using namespace std;
    10 
    11 const double PI = 4.0 * atan(1.0);
    12 
    13 struct Point {
    14     double x, y, z;
    15 }a[3];
    16 
    17 double dot(Point a, Point b) {
    18     return a.x * b.x + a.y * b.y + a.z * b.z;
    19 }
    20 
    21 Point cross(Point a, Point b) {
    22     Point ret;
    23     ret.x = a.y * b.z - a.z * b.y;
    24     ret.y = a.z * b.x - a.x * b.z;
    25     ret.z = a.x * b.y - a.y * b.x;
    26     return ret;
    27 }
    28 
    29 int T;
    30 
    31 int main()
    32 {
    33     //freopen("in.txt", "r", stdin);
    34     while(cin >> T) while(T--) {
    35         double A, B;
    36         for(int i = 0; i < 3; i ++) {
    37             cin >> A >> B;
    38             B = B * PI / 180; A = A * PI / 180;
    39             a[i].z = sin(B);
    40             a[i].x = cos(B) * cos(A);
    41             a[i].y = cos(B) * sin(A);
    42         }
    43         Point p1 = cross(a[0], a[1]), p2 = cross(a[1], a[2]), p3 = cross(a[2], a[0]);
    44         double l1 = sqrt(dot(p1, p1)), l2 = sqrt(dot(p2, p2)), l3 = sqrt(dot(p3, p3));
    45         double s1 = acos(dot(p1, p2) / l1 / l2), s2 = acos(dot(p2, p3) / l2 / l3), s3 = acos(dot(p3, p1) / l3 / l1);
    46         double ans = PI * 3 - s1 - s2 - s3;
    47         printf("%.2lf
    ", ans * 180 / PI);
    48     }
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    一道简单的数组遍历题,加上四个条件后感觉无从下手
    五分钟小知识:如何用算法高效寻找素数?
    如何高效对有序数组/链表去重?
    中级控件——文本输入——文本变化监听器
    中级控件——对话框——提醒对话框AlertDialog
    数据存储——四种存储方式——存储卡的文件操作——私有存储空间与公共存储空间
    中级控件——文本输入——焦点变更监听器
    中级控件——对话框——日期对话框DatePickerDialog
    中级控件——对话框——时间对话框TimePickerDialog
    数据存储——四种存储方式——共享参数SharedPreferences——保存路径是:/data/data/应用包名/shared_prefs/文件名.xml——实现密码登录功能——此章节是前面的内容整合
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/4493104.html
Copyright © 2020-2023  润新知