zoukankan      html  css  js  c++  java
  • 喵哈哈村的魔法考试 Round #13 (Div.2) 题解

    喵哈哈村的木星传说(一)

    旋转90°,找找规律就知道(x,y)->(n-1-y,x)

    然后输出就好了。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 55;
    int n,mp[maxn][maxn];
    int main(){
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                    cin>>mp[i][j];
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(j==0){
                        cout<<mp[n-1-j][i];
                    }else{
                        cout<<" "<<mp[n-1-j][i];
                    }
                }
                cout<<endl;
            }
        }
    }
    

    喵哈哈村的木星传说(二)

    考虑每一个字符串,我们观察知道字符串的字母顺序实际上是没有关系的。

    那么我们首先将字符串内的字符排序,然后再看看一共有多少种字符串就好了。

    #include<bits/stdc++.h>
    using namespace std;
    
    set<string> S;
    int n;
    int main(){
        while(cin>>n){
            S.clear();
            for(int i=0;i<n;i++){
                string s;
                cin>>s;
                sort(s.begin(),s.end());
                S.insert(s);
            }
            cout<<S.size()<<endl;
        }
    }
    

    喵哈哈村的木星传说(三)

    考虑dp[i][j]表示左边选了i个,右边选了j个dp的最大值。

    那么dp[i][j]就可以从dp[i-1][j],dp[i][j-1]转移过来。

    然后输出最大的就好了。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int f[2005][2005];
    int n,a[2005],ans=0;
    int main()
    {
        while(scanf("%d",&n)!=EOF){
            memset(f,0,sizeof(f));
            ans = 0;
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            for(int i=0;i<=n;i++)
                for(int j=0;j<=n-i;j++)
                    f[i+1][j+1]=max(f[i][j+1]+(i+j)*a[i],f[i+1][j]+(i+j)*a[n-j+1]);
            for(int i=0;i<=n;i++)ans=max(ans,f[i+1][n-i+1]);
            printf("%d
    ",ans);
        }
        return 0;
    }
    

    喵哈哈村的木星传说(四)

    首先行走的路线,贪心可以直到显然是(n>m)(0,0)->(1,0)->(2,0)->....->(n,0)->(n,1)->(n,2)->...->(n,m)这样走。

    然后整理一下公式,发现答案 = n + C(n+m+1,m),然后C(n+m+1,m)这个用lucas做出来就好。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #define P 1000000007
    #define ll long long
    using namespace std;
    inline ll read()
    {
        ll x=0;char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x;
    }
    ll n,m;
    ll qpow(ll a,ll b)
    {
        ll ans=1;
        for(ll i=b;i;i>>=1,a=(a*a)%P)
            if(i&1)ans=ans*a%P;
        return ans;
    }
    ll C(ll a,ll b)
    {
        if(b>a)return 0;
        if(b>a-b)b=a-b;
        ll s1=1,s2=1;
        for(ll i=1;i<=b;i++)
        {
            s1=s1*(a-i+1)%P;
            s2=s2*i%P;
        }
        return s1*qpow(s2,P-2)%P;
    }
    ll lucas(ll a,ll b)
    {
        return C(a/P,b/P)*C(a%P,b%P);
    }
    int main()
    {
        while(cin>>n>>m){
        //n=read();m=read();
            printf("%lld
    ",(lucas(n+m+1,min(n,m))+max(n,m))%P);
        }
        return 0;
    }
    

    喵哈哈村的木星传说(五)

    这是一道数学题。。。

    我们来举个例子:有一条边R从x指向y,它的数值大于0,AB对弈,现在A走

    {

    那么如果数值为1,A走过去,数值变为0,B就走不回来了

      如果数值为2,A走过去,数值变为1,如果B走回来,A不就死了?我们认为他们都足够聪明(虽然没有最强大脑聪明),怎么会做这么逗比的事情呢?(假设过来的前一条边已经走完了,数值为0)

      如果数值大于3(我们假定为3),A走过去,数值变为2,B如果仁慈地走回来,数值变为1,这样不就浪费了一步?

                                B如果按照题意残忍地用最佳行动走回来,取光所有数值,那么数值变为0,这条路就封死了,A做了一件无意义的事情,还封死了自己可以走的一条路,这对于先手的A而言是不利的,

                                这两种方法都明显有违双方最优的前提。  

    }

    ★★★所以我们可以知道,无论是A走还是B走,即无论是先手走还是后手走,每走过一条路都一定取完,这样问题就简单了★★★

    因为至少有个0,所以就简单了一点。。谁把对手逼到死路(两边都是0的)就赢了

    从起始点开始向两边找,只要有一边到0边距离为奇数就是先手赢反之后手赢

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<queue>
    #include<map>
    #define pa pair<int,int>
    #define inf 1000000000
    #define ll long long
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,l,r;
    int a[50];
    int main()
    {
        while(cin>>n)
        {
            l=0;
            r=n;
            for(int i=1;i<=n;i++)a[i]=read();
            while(a[l+1])l++;
            while(a[r])r--;
            r=n-r;
            if(l&1||r&1)puts("YES");
            else puts("NO");
        }
        return 0;
    }
  • 相关阅读:
    人际交往的原则
    做事的八大原则
    做人要有三颗心,两种意,简称:三心二意
    基于docker Jenkins搭建持续集成自动化测试环境,管理、配置、运行 Node 节点与 Slave 分布式运行
    docker dockerfile使用详解
    OS + Linux Memory / NUMA / Non-Uniform Memory Access
    my live PC / ThinkPad_X13_Yoga_Gen_2 / 20W8001RUS
    0. 《RDMA杂谈》专栏索引
    RDMA read and write with IB verbs
    深入浅出全面解析RDMA
  • 原文地址:https://www.cnblogs.com/qscqesze/p/6695036.html
Copyright © 2011-2022 走看看