• “玲珑杯”ACM比赛 Round #23


    A -- 生是脂肪的人

    Time Limit:2s Memory Limit:128MByte

    Submissions:263Solved:97

    DESCRIPTION

    给定一个整数n,输出[(10^n)/7]的个位数。
    其中 abs(n) ≤ 1e18

    INPUT
    第一行是一个正整数T (1 ≤ T ≤ 100),表示数据组数。 接下来每一行一个整数n。
    OUTPUT
    T行,每行一个整数。
    SAMPLE INPUT
    3
    1
    2
    3
    SAMPLE OUTPUT
    1
    4
    2
    A和/7的小数一样啊,也是142857循环的,直接做,但是本来说是正数,然后有负数很不厚道啊,数据范围锅了一次
    #include<bits/stdc++.h>
    using namespace std;
    string s="142857";
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            long long n;
            cin>>n;
            n--;
            if(n<0)
                printf("0
    ");
            else
            printf("%c
    ",s[n%6]);
        }
    B -- 死是脂肪的鬼

    Time Limit:2s Memory Limit:128MByte

    Submissions:127Solved:86

    DESCRIPTION

    给定一个99的数独,判断该数独是否合法。
    如果合法输出Yes,否则输出No。
    数独当且仅当每行每列以及9个33的小方格都是1〜9的9个数才合法。

    INPUT
    第一行是一个正整数T (1 ≤ T ≤ 100)表示数据组数,每组数据中:一共9行,每行9个正整数。 两组数据之间没有空行。 保证输入的数独中的数都在1~9中。
    OUTPUT
    一共T行,每行Yes或者No。
    SAMPLE INPUT
    1
    4 8 3 9 2 1 6 5 7
    9 6 7 3 4 5 8 2 1
    2 5 1 8 7 6 4 9 3
    5 4 8 1 3 2 9 7 6
    7 2 9 5 6 4 1 3 8
    1 3 6 7 9 8 2 4 5
    3 7 2 6 8 9 5 1 4
    8 1 4 2 5 3 7 6 9
    6 9 5 4 1 7 3 8 2
    SAMPLE OUTPUT
    Yes

    B直接暴力判断

    #include<bits/stdc++.h>
    using namespace std;
    int a[10][10];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int f=1;
            for(int i=0; i<9; i++)
                for(int j=0; j<9; j++)
                    scanf("%d",&a[i][j]);
            for(int i=2; i<9; i+=3)
                for(int j=2; j<9; j+=3)
                {
                    int b[11]= {0};
                    for(int k=i-2; k<=i; k++)
                        for(int l=j-2; l<=j; l++)
                            if(a[k][l]>0&&a[k][l]<10)b[a[k][l]]++;
                    for(int i=1; i<10; i++)
                        if(!b[i])f=0;
                }
            printf("%s
    ",f?"Yes":"No");
        }
    }
    C -- 你居然不吃巧克力

    Time Limit:2s Memory Limit:128MByte

    Submissions:131Solved:66

    DESCRIPTION

    给定一个正整数n,现在有n个石头,每个单独成一堆。
    现在可以每次合并两堆石头,产生的能量为两堆石头个数的min。
    你现在要将所有的石头合并成一堆,并且获得的能量最大。
    输出这个最大值。
    1 ≤ n ≤ 1e7。

    INPUT
    第一行是一个正整数T (1 ≤ T ≤ 10)表示数据组数,接下来T行每行一个正整数。 数据满足一个测试点中,最多只有1个n超过1e6。
    OUTPUT
    T行,每行一个正整数。
    SAMPLE INPUT
    3
    1
    3
    5
    SAMPLE OUTPUT
    0
    2
    5

    C太暴力了我,用的是合并

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            map<int,int>M;
            int n,a,b,c,d;
            scanf("%d",&n);
            M[1]=n;
            long long ans=0;
            for(;;)
            {
                a=M.begin()->first,b=M.begin()->second;
                if(b>1)
                {
                   ans+=b/2*a;
                   M[a+a]=b/2;
                   if(b&1)M[a]=1;
                   else M.erase(M.begin());
                }
                else  if(b==1)
                {
                    if(M.size()==1)break;
                    else
                    {
                        c=(++M.begin())->first,d=(++M.begin())->second;
                        ans+=a;
                        M[a+c]=1;
                        M.erase(M.begin());
                        M[c]=d-1;
                    }
                }
                else M.erase(M.begin());
                if(!M.size())break;
            }
            printf("%lld
    ",ans);
        }
    }

     蓝金爷的直接分堆

    #include<bits/stdc++.h>
    using namespace std;
    long long ans;
    void dfs(int x)
    {
        if(x==1)return;
        ans+=x/2,dfs(x/2);
        if(x&1)dfs(x/2+1);
        else dfs(x/2);
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            cin>>n;
            ans=0;
            dfs(n);
            cout<<ans<<"
    ";
        }
    }

    TLE的直接优先队列(1e7我电脑要2s,优化下可以1s跑完,但是OJ没那么快啊

    #include<bits/stdc++.h>
    using namespace std;
    priority_queue<int, vector<int>, greater<int> > Q;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            while(!Q.empty())Q.pop();
            int n;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
                Q.push(1);
            long long ans=0;
            while(Q.size()>=2)
            {
                int a=Q.top();Q.pop();
                int b=Q.top();Q.pop();
                ans+=a;
                Q.push(a+b);
            }
            printf("%lld
    ",ans);
        }
    }
    D -- 别不好意思,都是脂肪的人

    Time Limit:2s Memory Limit:128MByte

    Submissions:25Solved:20

    DESCRIPTION

    给定两个正整数 nn 和 kk, 请求出

    x1=0 x2=0...xn=0 x1+x2+...+xnkx1+x2+...+xn∑x1=0 ∑x2=0...∑xn=0 x1+x2+...+xnkx1+x2+...+xn

    (如果公式看不懂,请看图)

    数据保证答案是一个有理数,我们假设它为 pqpq , 你只需输出它对 1e9+71e9+7 的模即可。(即 pq1p∗q−1 对 1e9+71e9+7 的模数)。

    INPUT
    第一行一个正整数 TT 表示数据组数。 对于每组数据: 一行两个正整数,表示 nn 和 kk 。
    OUTPUT
    一共 TT 行,每行一个正整数,表示答案。
    SAMPLE INPUT
    1
    7
    3
    SAMPLE OUTPUT
    457031313
    HINT
    数据范围: 数据满足 1<=T<=1000,1<=n<=1e9,2<=k<=1e91<=T<=1000,1<=n<=1e9,2<=k<=1e9 。
    妈耶,看看他们的结论还差点啊
    n=1的时候
    k=1 
    k=2 2
    k=3 3/4
    k=4 4/9
    k=5 5/16
    k=6 6/25
    k=7 7/36
    这个我是直接用数据暴力的啊,很明显的,拿高数硬算也是可以的
    规律很明显 k / (k-1)^2
    最后是ans=n*k^n/(k-1)^(n+1),这个我没有搞出来
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MD=1e9+7;
    LL po(LL a, LL n)
    {
        LL ans = 1;
        while(n)
        {
            if(n&1) ans=(ans*a)%MD;
            a=(a*a)%MD;
            n>>=1;
        }
        return(ans+MD)%MD;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            LL n,k,a,b;
            scanf("%lld%lld",&n,&k);
            a=po(k,n)*n%MD;
            b=po(k-1,n+1)%MD;
            LL bn=po(b,MD-2);
            printf("%lld
    ",(a*bn)%MD);
        }
        return 0;
    }
     
  • 相关阅读:
    26. 删除排序数组中的重复项
    巧记“指针数组”与“数组指针”
    在 VC 下清空键盘缓冲区的方法
    负数、取模与取余
    任意键开始、暂停
    int 越界处理
    防闪屏批量绘图
    VC 下如何正确的创建及管理项目
    CSDN博客步骤:
    61 扑克牌中的顺子
  • 原文地址:https://www.cnblogs.com/BobHuang/p/8150433.html
Copyright © 2020-2023  润新知