zoukankan      html  css  js  c++  java
  • 盛大游戏杯第十五届上海大学程序设计联赛暨上海金马五校赛

    编程1小时,提交4小时

    做这种比赛一定要选一个好OJ啊

    黑白图像直方图

    发布时间: 2017年7月8日 21:00   最后更新: 2017年7月8日 22:38   时间限制: 1000ms   内存限制: 128M

    在一个矩形的灰度图像上,每个像素点或者是黑色的或者是白色的。黑色像素点用1 表示,白色像素点用0 表示。现在要求你编写一个程序,计算每列上黑色像素点的个数并输出。如下图所示是一个68 的黑板图像。 

    1 1 0 0 1 1 1 1
    0 1 1 0 1 0 1 0
    1 1 1 1 0 1 1 0
    0 1 1 0 0 1 0 0
    1 0 1 0 0 1 0 0
    0 1 0 1 0 1 1 0

    输入有多组组。
    每组的第一行有2 个整数mn ,(1<=mn<=100 )。
    接着有m 行,每行有n 个数字,每个数字是01 ,之间用一个空格分开。

    对图像数据,依次一行输出图像中每列黑色像素点的总数。

    复制
    3 5
    1 1 0 0 1
    0 1 1 0 1
    1 1 1 1 0
    6 8
    1 1 0 0 1 1 1 1
    0 1 1 0 1 0 1 0
    1 1 1 1 0 1 1 0
    0 1 1 0 0 1 0 0
    1 0 1 0 0 1 0 0
    0 1 0 1 0 1 1 0
    
    2 3 2 1 2
    3 5 4 2 2 5 4 1
    直接统计每列的和就好
    #include <bits/stdc++.h>
    using namespace std;
    int a[105];
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m;
        while(cin>>n>>m){
         for(int i=0;i<m;i++)
            a[i]=0;
         for(int i=0;i<n;i++)
         for(int j=0;j<m;j++){
            int p;
            cin>>p;
            a[j]+=p;
         }
         cout<<a[0];
         for(int i=1;i<m;i++){
            cout<<" "<<a[i];
         }
         cout<<endl;
        }
        return 0;
    }

    神无月排位赛

    发布时间: 2017年7月8日 21:06   最后更新: 2017年7月8日 22:35   时间限制: 1000ms   内存限制: 128M

    《神无月》作为盛大游戏2017年的全新原创大作,其开发团队在自研实力强大的传世工作室基础之上,还有美树本晴彦等日本一线知名画师及日本游戏音乐大师崎元仁加盟参与制作。目前正在不限号内测中,有很多玩家进入到神无月的世界中。

    在神无月中,有着玩家之间切磋的排位赛,其段位主要分为五大段位,从低到高依次为:新兵、菁英、战将、统帅、王者。每个玩家只有从新兵段位慢慢努力,一点点晋级才能到达王者段位。成为一个王者是每一个玩家的追求和心愿。

    image.png

    假设神无月的段位系统如下:

    从低到高的段位依次简记为:D、C、B、A、S。玩家打排位赛,每胜利1局增加10分,输1局扣除5分。每一个段位都需要积分,累计100分才可以进入晋级赛,晋级赛采用三局两胜制(3局中达到2局胜利就晋级成功,有2局失败就算晋级失败, 连胜或连败两局,第三局不需要打了)。晋级成功后,成为下一个段位,积分变为0,重新开始算分;如果晋级失败,则积分变为60,重新开始算分。为方便计算,如果该玩家一直输,积分降为0后,不再降分,也不会掉段位。

    大圣同学最近对神无月非常喜欢,一直在努力成为王者。他从新兵0分开始打排位赛(刚开始处在段位D),他告诉你最近若干场比赛的最后胜利情况,请你写个算法猜猜他现在所处的段位。当段位到达S时,段位将不再提高。

    有若干组数据。
    每组的第一行为一个N0<N<500 ),表示有N 场比赛数据。
    第二行有N 个数字,每个数字之间有空格隔开,每个数字代表每场比赛的输赢情况,1 表示赢,0 表示输。
    注意:当第n 场比赛结束时,若大圣同学正处于晋级赛,并且还无法决定晋级成功或失败,那么可以忽略这场晋级赛

    对于每组比赛数据,输出最后所处的段位的一个英文字符(DCBAS 这五个段位中的一个)。

    复制
    15
    1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
    30
    1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1
    
    C
    B
    
    模拟。把排位赛模拟下,晋级赛模拟下
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t;
        while(cin>>t)
        {
            int n=0,f=0,f1=0,f2=0,f3=0;
            for(int i=0; i<t; i++)
            {
                int p;
                cin>>p;
                if(!f)
                {
                    if(p)
                    n+=10;
                    else if(n>=5)
                    n-=5;
                    if(n>=100)
                        f=1;
                }
                else
                {
                    if(p)
                    f1+=1;
                    else f2+=1;
                    if(f2==2)
                    {
                        f=0;
                        n=60;
                        f1=0;
                        f2=0;
                    }
                    else if(f1==2)
                    {
                        f=0;
                        n=0;
                        f3++;
                        f1=0;
                        f2=0;
                    }
                }
            }
            if(f3>3)
            printf("S
    ");
            else if(f3>2)
                printf("A
    ");
            else if(f3>1)
                printf("B
    ");
            else if(f3>0)
                printf("C
    ");
            else
            printf("D
    ");
        }
        return 0;
    }

    I Love ces

    发布时间: 2017年7月8日 21:08   最后更新: 2017年7月8日 22:33   时间限制: 1000ms   内存限制: 128M

    时间过得好快啊,SHU计算机学院又有新的一批小朋友们进来了。2016级的同学想必也是非常喜欢计算机学院的,于是院长想测试一下大家对计算机的喜爱程度(院长大人别查我水表)。

    院长给大家一行由大写字母(A-Z)和小写字母(a-z)组成的字符串,允许同学们在这个字符串里面任意挑选若干个字符,问最多可以组成多少个I LOVE CES(不区分大小写,没有空格,即只要有这8个字符就可以组成一个)。

    多组输入,每组一行,输入一个字符串。
    字符串长度<=100000

    每组输出一行答案,如题意。

    复制
    IlovecesiLOVECES
    2
    统计字符个数
    #include <bits/stdc++.h>
    using namespace std;
    char s[100005];
    int main() {
        while(~scanf("%s",s)){
            int I=0,l=0,o=0,v=0,c=0,e=0,st=0;
            for(int i=0;s[i];i++)
                if(s[i]=='i'||s[i]=='I')
                I++;
                else if(s[i]=='l'||s[i]=='L')
                l++;
                else if(s[i]=='o'||s[i]=='O')
                o++;
                else if(s[i]=='v'||s[i]=='V')
                v++;
                else if(s[i]=='e'||s[i]=='E')
                e++;
                else if(s[i]=='c'||s[i]=='C')
                c++;
                else if(s[i]=='s'||s[i]=='S')
                st++;
            e/=2;
            printf("%d
    ",min(min(min(I,l),min(o,v)),min(min(c,e),st)));
    
        }
    
        return 0;
    }

    添加好友

    发布时间: 2017年7月8日 21:10   最后更新: 2017年7月8日 22:32   时间限制: 1000ms   内存限制: 128M

    Tony最近喜欢上了龙之谷游戏,所以他想叫上他的好友组建一个公会来一起享受这款游戏。

    Tony一共有n 个好友,他可以叫上任意k1<=k<=n )个好友来组建公会,并且所有好友都会答应他的请求。问Tony一共可以有多少种方案组建这个公会?

    只要不是完全相同的人组建的方案视为不同方案,并且Tony至少要叫上一个人。

    多组输入,每组一行,输入一个正整数n1<=n<=1000000000 )。

    每组输出一行,输出方案数。(对1000000007 取膜)

    复制
    2
    3
    就是2^n-1对1e9+7取模,直接快速幂模板就行
    #include <stdio.h>
    #include <bits/stdc++.h>
    typedef long long LL;
    const LL c=1e9+7;
    using namespace std;
    LL la(LL a, LL b)
    {
        LL ans=1;
        a%=c;
        while(b>0){
            if(b%2==1)
            ans=(ans*a)%c;
            b=b/2;
            a=(a*a)%c;
        }
        return ans;
    }
    int main() {
        LL n;
        while(cin>>n){
            printf("%lld
    ",(la(2,n)-1+c)%c);
        }
        return 0;
    }

    字符串进制转换

    发布时间: 2017年7月8日 21:13   最后更新: 2017年7月8日 22:31   时间限制: 1000ms   内存限制: 128M

    Claire Redfield在龙之谷游戏的一次任务中获得了一个上了锁的宝箱,上面刻了一串由小写字母构成的字符串A和一个数字m

    经过Claire长时间研究,他发现密码是和am 有关的。字符串A相当于一个26进制的数字,a 相当于0b 相当于1 …….z 相当于25 。然后要将这个26进制的数转化成m 进制那就是这个宝箱的密码。

    Claire觉得这个太简单了所以要你帮她完成。

    多组输入,每组一行,输入一个字符串A 和一个正整数m
    字符串长度<=102<=m<=9

    每组输出一行答案,如题意。

    复制
    b 2
    1
    简单的进制转换
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    char f[100];
    int l;
    void la(LL n, int b) {
        static char c[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        l=0;
        while(n) {
            f[l++]=c[n%b];
            n=n/b;
        }
    }
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
       string s;
       int m;
       while(cin>>s>>m){
        LL t=0;
        for(int i=0;s[i];i++)
            t=t*26+s[i]-'a';
       if(t==0){
        printf("%d",0);
       }
       else{
        la(t,m);
        for(int k=l-1; k>=0; k--)
        printf("%c",f[k]);
       }
       puts("");
    }
        return 0;
    }

    A序列

    发布时间: 2017年7月8日 21:16   最后更新: 2017年7月8日 22:29   时间限制: 1000ms   内存限制: 128M

    如果一个序列有奇数个正整数组成,不妨令此序列为a1,a2,a3,...,a2k+1 (0<=k ),并且a1,a2...ak+1 是一个严格递增的序列,ak+1,ak+2,...,a2k+1 ,是一个严格递减的序列,则称此序列是A序列。

    比如1 2 5 4 3就是一个A序列。

    现在Jazz有一个长度为n 的数组,他希望让你求出这个数组所有满足A序列定义的子序列里面最大的那个长度。(子序列可以不连续)

    比如1 2 5 4 3 6 7 8 9,最长的A序列子串是1 2 5 4 3。

    多组输入,每组两行。
    第一行是n ,表示给的数组的长度。
    第二行有n 个数(int范围),即给你的数组。
    1<=n<=500000

    每组输入输出一行,即最长的A序列子串的长度。

    复制
    9
    1 2 5 4 3 6 7 8 9
    
    5
    最长上升子序列,正着来一次,倒着来一次,但是复杂度要nlogn的
    最长上升子序列的思路来自这里,应该没毛病,OJ炸了
    #include<stdio.h>
    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+10;
    int a[N],f[N],l[N],r[N];
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            for(int i=1; i<=n; i++)
                scanf("%d",&a[i]);
            int c=1;
            l[1]=1,r[n]=1,f[1]=a[1];
            for(int i=2; i<=n; i++)
            {
                if(a[i]>f[c]) {f[++c]=a[i];l[i]=c;}
                else
                {
                    int k=lower_bound(f+1,f+c,a[i])-f;
                    l[i]=k;
                    f[k]=a[i];
                }
            }
            c=1,f[1]=a[n];
            for(int i=n-1; i ; i--)
            {
                if(a[i]>f[c]) {f[++c]=a[i];r[i]=c;}
                else
                {
                    int k=lower_bound(f+1,f+c,a[i])-f;
                    r[i]=k;
                    f[k]=a[i];
                }
            }
            c=0;
            for(int i=1; i<=n; i++)
                c=max(c,min(2*l[i]-1,2*r[i]-1));
            printf("%d
    ",c);}
        return 0;
    }

     巧用c++的stl简单实现最长上升子序列

    fill(g,g+n,infinity);
    for(int i=0;i<n;i++) {
        int j=lower_bound(g, g+n,a[i])-g;
        f[i]=j+1;
        g[j]=a[i];
    }

    丢史蒂芬妮

    发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:05   时间限制: 1000ms   内存限制: 128M

    有一天,空和白很无聊,决定玩盛大游戏,考虑到两个人玩,他们随便掏了一个游戏出来:在一个nm的棋盘上,首先把史蒂芬妮·多拉放在左上角(1,1)的位置。每次一个人可以将她往下,往右,往右下丢一格。当前回合,谁不能丢史蒂芬妮,谁就输了。(注意,不可以把活人丢出棋盘啦!)游戏总是空先手。

    白说,这是一个垃圾游戏!我们每次把史蒂芬妮丢素数个位置吧!(换句话说,每次丢2357或…格)空答应了。

    我们都知道,空和白都很聪明,不管哪方存在一个可以必胜的最优策略,都会按照最优策略保证胜利。

    玩了一局,空已经知道了这个游戏的套路,现在他决定考考你,对于给定的nm,空是赢是输?如果空必胜,输出“Sora”(无引号);反之,输出“Shiro”(无引号)。

    第一行有一个T表示数组组数,1<=T<100000
    从第二行开始,每行为棋盘大小,nm分别表示行列。
    1=<n<=5001=<m<=500

    对于每组数据,按题目要求输出。

    4
    1 1
    2 2
    10 10
    30 30
    

    Shiro
    Shiro
    Shiro
    Sora


    这个就是个sg函数呗,比如我2就是个必胜啊
    然后设个三重循环考虑终点
    这位聚聚的预处理
    也可以进这位聚聚的博客看其他代码哦

    #include <bits/stdc++.h>
    using namespace std;
    #define mst(a,b) memset((a),(b),sizeof(a))
    const int maxn= 500;
    const ll mod = 1e9+7;
    const int INF = 0x3f3f3f3f;
    const double eps = 1e-6;
    int prime[maxn+5]= {0};
    int num_prime=0;
    bool isprime[maxn+5]= {1,1};
    int vis[maxn+5][maxn+5];
    void init()
    {
        for(int i=2; i<maxn+5; i++)
        {
            if(!isprime[i])
                prime[num_prime++]=i;
            for(int j=0; j<num_prime&&i*prime[j]<maxn+5; j++)
            {
                isprime[i*prime[j]]=1;
                if(i%prime[j]==0)
                    break;
            }
        }
        mst(vis,0);                     //1:必胜 2:必败
        vis[1][1]=2;
        for(int i=1; i<=maxn; i++)
        {
            for(int j=1; j<=maxn; j++)
            {
                if(vis[i][j]==0)
                {
                    vis[i][j]=2;
                }
                if(vis[i][j]==2)
                {
                    for(int k=0; ; k++)
                    {
                        if(i+prime[k]>maxn&&j+prime[k]>maxn)
                            break;
                        if(i+prime[k]<=maxn)
                        {
                            vis[i+prime[k]][j]=1;
                        }
                        if(j+prime[k]<=maxn)
                        {
                            vis[i][j+prime[k]]=1;
                        }
                        if(i+prime[k]<=maxn&&j+prime[k]<=maxn)
                        {
                            vis[i+prime[k]][j+prime[k]]=1;
                        }
                    }
                }
            }
        }
    }
    int main()
    {
        init();
        int n,m;
        int T;scanf("%d",&T);while(T--)
        {
            scanf("%d%d",&n,&m);
            if(vis[n][m]==1) puts("Sora");
            else puts("Shiro");
        }
        return 0;
    }

    另一位聚聚的记忆化搜索

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k,t,qu[maxn];
    bool dp[maxn][maxn],vis[maxn][maxn];
    bool dfs(int x,int y)
    {
        if(vis[x][y])return dp[x][y];
        vis[x][y]=true;
        for(int i=1;i<=qu[0];i++)
        {
            if(x-qu[i]>0)dp[x][y]|=(!dfs(x-qu[i],y));
            if(y-qu[i]>0)dp[x][y]|=(!dfs(x,y-qu[i]));
            if(x-qu[i]>0&&y-qu[i]>0)dp[x][y]|=(!dfs(x-qu[i],y-qu[i]));
        }
        return dp[x][y];
    }
    bool sushu(int x)
    {
        if(x==2)return true;
        else if(x%2==0)return false;
        for(int i=3;i*i<=x;i+=2)if(x%i==0)return false;
        return true;
    }
    void init()
    {
        int i,j;
        rep(i,2,maxn-10)if(sushu(i))qu[++qu[0]]=i;
        rep(i,1,maxn-10)rep(j,1,maxn-10)dfs(i,j);
    }
    int main()
    {
        int i,j;
        init();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            puts(dp[n][m]?"Sora":"Shiro");
        }
        return 0;
    }
     
  • 相关阅读:
    COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
    A Complete ActiveX Web Control Tutorial
    C++使用VARIANT实现二维数组的操作
    用户自定义结构数据与VARIANT转换
    VS2008中使用JSONCPP方法小结
    HDOJ 2030 汉字统计
    HDOJ 1312 (POJ 1979) Red and Black
    POJ 1503 Integer Inquiry 简单大数相加
    POJ 1936 All in All
    枚举法
  • 原文地址:https://www.cnblogs.com/BobHuang/p/7142454.html
Copyright © 2011-2022 走看看