“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博(

Posted Angel_Kitty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博(相关的知识,希望对你有一定的参考价值。

黑白图像直方图

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

描述

在一个矩形的灰度图像上,每个像素点或者是黑色的或者是白色的。黑色像素点用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个整数m、n,(1<=m,n<=100)。
接着有m行,每行有n个数字,每个数字是0或1,之间用一个空格分开。

输出

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

样例输入1

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

样例输出1

2 3 2 1 2
3 5 4 2 2 5 4 1

 

分析:签到题吧,直接按照列打出来就好了!
下面给出AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int dp[105][105];
 4 int main()
 5 {
 6     int n,m;
 7     while(cin>>n>>m)
 8     {
 9     for(int i=0;i<n;i++)
10     {
11         for(int j=0;j<m;j++)
12         {
13             cin>>dp[i][j];
14         }
15     }
16     for(int i=0;i<m;i++)
17     {
18         int ans=0;
19         for(int j=0;j<n;j++)
20         {
21             if(dp[j][i]==1)
22                 ans++;
23         }
24         if(i==m-1) cout<<ans;
25         else cout<<ans<<" ";
26     }
27     cout<<endl;
28     }
29     return 0;
30 }

神无月排位赛

发布时间: 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时,段位将不再提高。

输入

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

输出

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

样例输入1

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

样例输出1

C
B
分析:签到题,很简单,看看代码就会了!
下面给出AC代码:
 1 #include <bits/stdc++.h>
 2 #define mod 1000000007
 3 typedef long long ll;
 4 using namespace std;
 5 int m;
 6 int s[100005];
 7 int main(){ 
 8 int len;
 9 while(cin>>len){
10 for(int i=0;i<len;i++) scanf("%d",s+i);
11 int dw=3,jf=0,flag=0,p=0;
12 for(int i=0;i<len;i++){
13 if(flag>0){
14 flag++;
15 if(s[i]==1) p++;
16 else p--;
17 }else{
18 if(s[i]==1) jf+=10;
19 else jf-=5; 
20 }
21 if(jf>=100 && flag==0){
22 flag++;
23 }
24 if(flag==4 || p>=2 || p<=-2){
25 flag=0;
26 if(p>0) dw--,jf=0;
27 else jf=60;
28 p=0;
29 }
30 if(jf<0) jf=0;
31 }
32 if(dw<0) cout<<"S"<<endl;
33 else cout<<(char)(dw+\'A\')<<endl;
34 }
35 return 0;
36 } 

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。

输出

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

样例输入1

IlovecesiLOVECES

样例输出1

2

分析:签到题,没什么好解释的,看代码好了!
下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=100010;
 5 char s[maxn];
 6 int ans[8];
 7 int main()
 8 {
 9     while(cin>>s)
10     {
11     int len=strlen(s);
12         memset(ans,0,sizeof(ans));
13     for(int i=0;i<len;i++)
14     {
15         if(s[i]==\'I\'||s[i]==\'i\')
16             ans[1]++;
17         if(s[i]==\'L\'||s[i]==\'l\')
18             ans[2]++;
19         if(s[i]==\'O\'||s[i]==\'o\')
20             ans[3]++;
21         if(s[i]==\'V\'||s[i]==\'v\')
22             ans[4]++;
23         if(s[i]==\'E\'||s[i]==\'e\')
24             ans[5]++;
25         if(s[i]==\'C\'||s[i]==\'c\')
26             ans[6]++;
27         if(s[i]==\'S\'||s[i]==\'s\')
28             ans[7]++;
29     }
30     ans[5]/=2;
31     sort(ans+1,ans+7);
32     cout<<ans[1]<<endl;
33     }
34     return 0;
35 }

添加好友

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

描述

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

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

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

输入

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

输出

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

样例输入1

2

样例输出1

3


分析:就是一个快速幂的板子,抄下就好了!
下面给出AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod=1000000007;
 5 inline ll gcd(ll x,ll p)
 6 {
 7     ll cnt=1;
 8     for(;p;p>>=1,x=x*x%mod)
 9     {
10         if(p&1)
11             cnt=cnt*x%mod;
12     }
13     return cnt;
14 }
15 int main()
16 {
17     ll n;
18     while(cin>>n)
19     {
20     ll ans=(gcd(2,n)-1)%mod;
21     cout<<ans<<endl;
22     }
23     return 0;
24 }

字符串进制转换

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

描述

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

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

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

输入

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

输出

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

样例输入1

b 2

样例输出1

1


分析:优先队列乱搞就好了!
 1 #include <bits/stdc++.h>
 2 #define mod 1000000007
 3 typedef long long ll;
 4 using namespace std;
 5 int m;
 6 char s[100005];
 7 int main(){ 
 8 while(cin>>s>>m){
 9 stack<int> st;
10 ll sum=0;
11 for(int i=0;i<strlen(s);i++){
12 sum=sum*26+s[i]-\'a\';
13 }
14 while(sum){
15 st.push(sum%m);
16 sum/=m;
17 }
18 if(st.size()==0){
19 cout<<0;
20 }else{
21 while(st.size()){
22 cout<<st.top();st.pop();
23 }
24 }
25 cout<<endl;
26 }
27 return 0;
28 } 

官方题解:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <string>
 5 #include <cstring>
 6 #include <map>
 7 #include <queue>
 8 #include <algorithm>
 9 using namespace std;
10 
11 const int INF=0x3f3f3f3f;
12 const int maxn=1100;
13 
14 //109
15 char ss[15];
16 int a[110];
17 int main()
18 {
19 
20   int n,m,len;
21   long long s,x;
22   while (~scanf("%s%d",ss,&m))
23   {
24    len=strlen(ss);
25    x=1; s=0;
26 
27    for (int i=len-1;i>=0;i--)
28    {
29     s+=x*(ss[i]-\'a\');
30     x*=26;
31    }
32   // printf("%lld\\n",s);
33    n=0;
34    if (s==0) printf("0");
35    else
36   {
37          while (s)
38    {
39     a[++n]=s%m;
40     s=s/m;
41    }
42    for (int i=n;i>=1;i--) printf("%d",a[i]);
43   }
44     printf("\\n");
45   }
46 
47     return 0;
48 }

A序列

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

描述

如果一个序列有奇数个正整数组成,不妨令此序列为a1,a2,a3,...,a2∗k+1(0<=k),并且a1,a2...ak+1是一个严格递增的序列,ak+1,ak+2,...,a2∗k+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序列子串的长度。

样例输入1 

9

1 2 5 4 3 6 7 8 9

样例输出1

5

题目链接:http://acmoj.shu.edu.cn/contest/27/problem/110/

下面给出AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <string>
 5 #include <cstring>
 6 #include <map>
 7 #include <queue>
 8 #include <algorithm>
 9 using namespace std;
10 
11 const int INF=0x3f3f3f3f;
12 const int maxn=50010;
13 
14 //110
15 int a[maxn],l[maxn],r[maxn],d[maxn];
16 int main()
17 {
18 
19   int n,i,j,maxx,len;
20 
21   while (~scanf("%d",&n))
22   {
23     for (i=1;i<=n;i++) scanf("%d",&a[i]);
24     d[1]=a[1]; len=1; l[1]=1;
25     for (i=2;i<=n;i++)
26     {
27         if (a[i]>d[len]) { d[++len]=a[i]; l[i]=len; }
28         else
29         for (j=1;j<=len;j++)
30             if (d[j]>=a[i]) {d[j]=a[i]; l[i]=j; break; }
31     }
32   //  for (i=1;i<=n;i++) printf("%d ",l[i]); printf("\\n");
33     r[n]=1; d[1]=a[n]; len=1;
34     maxx=1;
35     for (i=n-1;i>=1;i--)
36     {
37         if (a[i]>d[len]) { d[++len]=a[i]; maxx=max(maxx,min(l[i],len)*2-1); }
38         else
39        for (j=1;j<=len;j++)
40             if (d[j]>=a[i]) {d[j]=a[i]; maxx=max(maxx,min(l[i],len)*2-1); break; }
41     }
42    // for (i=1;i<=n;i++) printf("%d ",r[i]); printf("\\n");
43     printf("%d\\n",maxx);
44   }
45 
46     return 0;
47 }

战斗

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

描述

最近,盛大计划开发一款手游,以下是简化版。系统和我方各有n头怪兽,每一头怪兽都有生命值和攻击力,并且当怪兽A攻击怪兽B,如果怪兽B的生命值高于怪兽A的攻击力,则怪兽B的生命力减少A的攻击力的数值,否则怪兽B将死亡。我方已经通过一些手段得知了系统怪兽的出战序列,我方想要知道,我方是否可以合理安排怪兽的出战序列,保证当系统的n头怪兽全部死亡时,而我方至少还存在一头怪兽。

所有怪兽是每秒攻击一次,即如果A和B战斗,A受到B的伤害的同时,B也受到A的伤害,直到一方死亡,换序列中的下一个怪兽,继续战斗。

输入

第一行一个整数T,表示测试组数。
对于每组数据,第一行输入一个整数n,1<=n<=10, 表示怪兽的数目。
接下来n行,表示系统n头怪兽的出战序列,每一行两个整数v,a, 1<=v<=1000, 1<=a<=100. 其中v表示生命值,a表示攻击力。
接下来n行,表示我方n头怪兽,但是出战序列可以由我方自己安排。每行两个整数,含义类似。

输出

每组数据输出一行。如果我方可以通过合理安排怪兽的出战序列,保证当系统的n头怪兽全部死亡,而我方至少还存在一头怪兽,那么输出YES;否则输出NO

样例输入1 

2

2

5 4

4 3

3 2

5 4

2

5 4

4 3

3 2

5 5

样例输出1

NO

YES

题目链接:http://acmoj.shu.edu.cn/contest/27/problem/111/

题解思路:因为我们要用最少的血量大最多的攻击力所以将我方怪兽按攻击力从大到小排序然后生命力按从小到大排序然后跟系统怪兽对打判断是否能赢即可

下面给出AC代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<ctime>
 4 #include<cstdlib>
 5 #include<cstdio>
 6 #include<vector>
 7 #include<algorithm>
 8 using namespace std;
 9 struct node{
10     int x,y;
11     bool operator<(node a)const{
12         if(y != a.y)    return y > a.y;
13         return x < a.x;
14     }
15 }a[15],b[15];
16 int n;
17 int flag;
18 bool check(){
19     node b1[15],b2[15];
20     for(int i = 0; i < n; i++){
21         b1[i] = a[i];
22         b2[i] = b[i];
23     }
24     int k = 0,j = 0;
25     for(;k<n&&j<n;){
26         int s1 = (b1[j].x-1)/b2[k].y+1;
27         int s2 = (b2[k].x-1)/b1[j].y+1;
28         if(s1>s2)
29             b1[j].x-=s2*b2[k].y,k++; 
30         else if(s2>s1)
31             b2[k].x-=s1*b1[j].y,j++;
32         else    k++,j++;
33     }
34     return k < n;
35 }
36 int main(){
37     int t;
38     scanf("%d",&t);
39     while(t--){
40         scanf("%d",&n);
41         for(int i = 0; i < n; i++)
42             scanf("%d%d",&a[i].x,&a[i].y);
43         for(int i = 0; i < n; i++)
44             scanf("%d%d",&b[i].x,&b[i].y);
45         sort(b,b+n);
46         check()?puts("YES"):puts("NO");
47     }
“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 A

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 B

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 H

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 F

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 I.丢史蒂芬妮

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 D