zoukankan      html  css  js  c++  java
  • Codeforces Round #399 B 思维 C 模拟 D 概率dp E SG博弈

    Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)
    B. Code For 1

    题意:数n,不断拆分为 n/2, n&1, n/2,直到都为0或1。求区间[l, r]有多少个1。

    tags:画一画很容易看出来,类似dfs中序遍历。

    //#399 B
    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 2e5+10;
    
    ll get(ll n)
    {
        if(n<2) return 1;
        return (get(n>>1))*2+1;
    }
    ll solve(ll n, ll l, ll r)
    {
        if(n<2) return n;
        ll sz=get(n>>1), ans=0;
        if(l<=sz) ans+=solve(n>>1, l, min(r,sz));
        if(l<=sz+1 && sz+1<=r) ans+=(n&1);
        if(sz+1<r) ans+=solve(n>>1, max(l-(sz+1),0LL), r-(sz+1));   // -(sz+1)有点巧妙
        return ans;
    }
    int main()
    {
        ll n, l, r;
        cin>>n>>l>>r;
        cout<<solve(n, l, r)<<endl;
    
        return 0;
    }
    View Code

     C. Jon Snow and his Favourite Number

    题意:数列a[],操作:将a[]从小到大排序,选取所有标号为奇数的数,使其异或 x。执行 k次,求最后数列中最大和最小的数值。

    tags:仔细看题,关键是 a[i]<=1e3。所在对于所在可能出现的数都用数组搞出来就好。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 1e5+10, M=1024;
    
    int a[N], cnt[N], n, k, x;
    int main()
    {
        scanf("%d %d %d", &n, &k, &x);
        int ai;
        rep(i,1,n) {
            scanf("%d", &ai);
            a[ai]++;
        }
        rep(ca,1,k) {
            int tot=0, y;
            rep(i,0,M) {
                if(tot&1) cnt[i]=a[i]>>1;
                else cnt[i]=(a[i]+1)>>1;
                tot+=a[i];
            }
            rep(i,0,M) a[i]-=cnt[i], a[i^x]+=cnt[i];
        }
        per(i,M,0) if(a[i]) { printf("%d ", i); break; }
        rep(i,0,M) if(a[i]) { printf("%d
    ", i); break; }
    
        return 0;
    }
    View Code

     D. Jon and Orbs

    题意:有k种球,每天随机生成一个球。任务:集齐k种球,每种球至少有一个。给出pi,要使得完成任务的概率不小于(pi-epx)/2000, epx=1e-7,求最少需要多少天。

    tags:dp[n][x]为第n天集齐了x种球的概率,状态转移:dp[n][x]=dp[n-1][x]*(x/k) + dp[n-1][x-1]*(k-(x-1))/k。预处理出dp[][],最后看dp[i][k]>=(pi-epx)/2000, 1<= i <=N 。 天数N取到1e4绝对够了。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 1e4+10, M = 1e3+10;
    const double epx = 1e-7;
    
    double dp[N][M];
    int main()
    {
        int k, q, p;
        scanf("%d %d", &k, &q);
        dp[0][0]=1;
        rep(i,1,N-1) rep(j,1,k) {
            dp[i][j]=dp[i-1][j]*j/k + dp[i-1][j-1]*(k-(j-1))/k;
        }
        while(q--) {
            scanf("%d", &p);
            rep(i,1,N-1) {
                if(dp[i][k]>=(p-epx)/2000) {
                    printf("%d
    ", i);
                    break;
                }
            }
        }
    
        return 0;
    }
    View Code

    E. Game of Stones

    题意:n堆石子,两人轮流每次选一堆至少取走一个,最后不能取者败。限制:每一堆不能多次取同样多个石子,比如取走过 k 个,那这一堆就不能再取 k 个。问后手胜负。

    tags:推出SG函数。但有个写法不明白。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define pb push_back
    typedef long long ll;
    const int N = 2e5+10;
    
    int main()
    {
        /*
        int n, si, ans=0;
        int sg[]={0 ,1 ,1 ,2 ,2 ,2 ,3 ,3 ,3 ,3 ,4 ,4 ,4 ,4 ,4 ,5 ,5 ,5 ,5 ,5 ,5 ,6 ,6 ,6 ,6 ,6 ,6 ,6 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,10 ,10 ,10 ,10 ,10 ,10 ,10 ,10 ,10 ,10 ,10 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,11 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,12 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,13 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,14 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,17 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,18 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 ,19 };
        cin>>n;
        rep(ca,1,n) {
            cin>>si;
            ans^=sg[si];
        }
        ans ? puts("NO") : puts("YES");
        */
        int n, ans=0, si;
        cin>>n;
        rep(ca,1,n) {
            cin>>si;
            ans^= ((int)sqrt(8*si+1)-1)/2;     //不明白
        }
        ans ? puts("NO") : puts("YES");
    
        return 0;
    }
    View Code
  • 相关阅读:
    简单的抽奖程序
    WinForm——记住密码
    《Effective C#中文版:改善C#程序的50种方法》读书笔记
    初入博客,给自己的学习定一个目标。
    做IT博客的第一天哈哈
    多表关联查询加内联形式收藏
    UpdateProgress的AssociatedUpdatePanelID属性增加后依然不显示的问题解决(转载)
    SQL Server2005安装找不到SQL Server Management Studio解决办法
    Access中not in优化方式
    App.Config文件中包含中文汉字程序出错的解决办法
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6440757.html
Copyright © 2011-2022 走看看