2017西安电子科技大学第十五届“华为杯”大学生程序设计竞赛网络赛

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017西安电子科技大学第十五届“华为杯”大学生程序设计竞赛网络赛相关的知识,希望对你有一定的参考价值。

问题 B: 笑爷买房

时间限制: 1 Sec  内存限制: 128 MB
提交: 456  解决: 116
[提交][状态][讨论版]

题目描述

笑爷打算在北京三环买一套房。

现在笑爷手上有一些房源的户型图,她想知道每套房屋的室内面积是多少。
房屋的墙壁由‘#‘表示,一平方米的地面由一个‘*‘表示。请统计被墙壁包围住的地面面积是多少平方米。

输入

一个由#和*组成的字符矩阵,行列数均不超过50。(不一定是矩形)

输出

输出房屋有多少平方米并换行。

样例输入

#*#######
##******#
*#######*

样例输出

6
技术分享
 1 #include <bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 int R,C;
 6 char maps[55][55];
 7 bool vis[55][55];
 8  
 9 int dr[4] = {-1,1,0,0};
10 int dc[4] = {0,0,-1,1};
11  
12 int sum;
13 int ans;
14 bool flag;
15 void dfs(int r,int c) {
16     if(r<0||r>=R||c<0||c>=C) return;
17     if(vis[r][c]||maps[r][c]!=*) return;
18  
19     vis[r][c] = true;
20     sum++;
21     if(r==0||r==R-1||c==0||c==C-1)
22         flag = false;
23     for(int i=0;i<4;i++) {
24         int tx = r + dr[i];
25         int ty = c + dc[i];
26         dfs(tx,ty);
27     }
28 }
29  
30 int main()
31 {
32     //freopen("in.txt","r",stdin);
33     while(scanf("%s",maps[R])!=EOF) {
34         R++;
35     }
36  
37     C = strlen(maps[0]);
38     for(int i=0;i<R;i++) {
39         for(int j=0;j<C;j++) {
40             if(!vis[i][j]&&maps[i][j]==*) {
41                 flag = true;
42                 sum = 0;
43                 dfs(i,j);
44                 if(flag)
45                     ans +=sum;
46             }
47         }
48  
49     }
50     printf("%d\n",ans);
51     return 0;
52 }
53  
54 /**************************************************************
55     Problem: 1186
56     User: 20153780
57     Language: C++
58     Result: 正确
59     Time:2 ms
60     Memory:1712 kb
61 ****************************************************************/
View Code

 

问题 C: 大大数星星

时间限制: 1 Sec  内存限制: 128 MB
提交: 1151  解决: 422
[提交][状态][讨论版]

题目描述

喜欢数星星真是个传染病,这一天大大和大嫂晚上走在路上抬头看到很多星星,他们发现星星密密麻麻的布满了整个天空,大嫂说她想用线将天空的星星分割开,但是只给大大n根无限长的直线!大大为了让大嫂开心,想问问你最多能把星星分割成多少份!

 

输入

读入多组数据,处理到文件结束为止!(不超过5000组)
每组数据一个整数n(0<=n<=10000000)

 

输出

对于每组输出一个整数,表示最多分割的份数。

样例输入

0
1
2

样例输出

1
2
4

提示

 

请使用六十四位整数,%lld
f(n) = f(n-1) + n;

 

问题 D: 善良的大红

时间限制: 1 Sec  内存限制: 128 MB
提交: 789  解决: 394
[提交][状态][讨论版]

题目描述

大红知道学弟学妹做题可能很辛苦,特地准备了一道小点心,你看到这道题目会不会有点熟悉呢?

输入一个整数n(n>=1 && n <=26),输出如下的n层字母三角形。

具体参看输入输出样例。

输入

多组数据,每行一个正整数,n(n>=1 && n <= 26)

请处理到文件结束。

输出

对于每一个输入的正整数,打印对应的字母三角形。注意每行的空格哦,当n==26时,最后一行行首恰好没有空格。

样例输入

1
2
3

样例输出

                         A
                         A
                        ABA
                         A
                        ABA
                       ABCBA

打表。

 

 

问题 E: 虢莔薅参加运动会

时间限制: 1 Sec  内存限制: 128 MB
提交: 1374  解决: 243
[提交][状态][讨论版]

题目描述

又到了金色的春天,一年一度的运动会就要来了,虢莔薅同学是班里的体育委员,于是他早早的就订好了运动会的时候和女朋友出去玩的计划!不对,是刷题的计划!但是今天他的导员找到了他,让他作为班级代表参加10项比赛!虢莔薅听了说:“这会死的!”,导员哈哈大笑说:“多吃点高钙片就好了”。经过了1个小时的激烈争论,两人终于达成协议,只要导员做出虢莔薅出的题虢莔薅就参加,否则就让他去刷题!于是虢莔薅说出了题:求sum(i^2)%p,1<=i<=n,p是一个素数。(sum表示求和,%表示求余)为了班级的荣誉,你快帮帮导员做出这个题吧!

输入

多组数据处理到文件结束。(不超过50组)
每行一组数据,包含两个正整数n(1<=n<=10^15),p(2<=p<=10^9)。

 

输出

对于每组数据,输出一个数,表示sum(i^2)%p的值

样例输入

1 7
2 11
3 13

样例输出

1
5
1

java大整数

 

问题 F: 统计相似字符串

时间限制: 1 Sec  内存限制: 128 MB
提交: 754  解决: 118
[提交][状态][讨论版]

题目描述

给N个字符串,请将他们以相同的组成元素(即组成的元素种类相同,每种元素的个数也一样)来分类,分类后按照原本出现的顺序输出!

输入

多组数据,最多100组数据,每组最多N<5000个字符串,每个字符串长度最多|s|<=8,保证都是小写字母

 

输出

输出多行,每行为同一类别的字符串组

样例输入

6
eat tea tan ate nat bat

样例输出

eat tea ate
tan nat
bat

hash

技术分享
 1 #include <bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 int a[26];
 6  
 7 int BKDRHash(string str)
 8 {
 9     int seed = 131; // 31 131 1313 13131 131313 etc..
10     int hash = 0;
11  
12     for(int i=0;i<str.length();i++)
13         hash = hash * seed + (str[i]-a+1);
14  
15     return (hash & 0x7FFFFFFF);
16 }
17  
18 int main()
19 {
20     int n;
21     while(scanf("%d",&n)!=EOF)
22     {
23  
24         int cnt = 0;
25         string str;
26         map<int,int> s;
27         vector<string> v[10000];
28         while(n--)
29         {
30             cin>>str;
31             string tmp = str;
32             int len = str.length();
33             sort(tmp.begin(),tmp.end());
34             int hashs= BKDRHash(tmp);
35  
36  
37             if(s.count(hashs)>0)
38             {
39                 v[s[hashs]].push_back(str);
40             }
41             else
42             {
43                 s[hashs] = cnt;
44                 v[cnt++].push_back(str);
45             }
46         }
47  
48         for(int i=0; i<cnt; i++)
49         {
50             int x = v[i].size();
51             for(int j=0; j<x-1; j++)
52             {
53                 cout<<v[i][j]<<" ";
54             }
55             cout<<v[i][x-1];
56             puts("");
57         }
58     }
59  
60  
61     return 0;
62 }
63  
64 /**************************************************************
65     Problem: 1191
66     User: 20153780
67     Language: C++
68     Result: 正确
69     Time:276 ms
70     Memory:1968 kb
71 ****************************************************************/
View Code

 

问题 G: 锘爷考驾照

时间限制: 1 Sec  内存限制: 128 MB
提交: 757  解决: 211
[提交][状态][讨论版]

题目描述

大家都知道,锘爷是XDUdp第一人,所以锘爷决定要去考驾照!(这很有逻辑吧),他为了一次考到驾照,于是买了一辆越野车从学校开回家来练习开车,在途中就会有很多高山和低谷(低谷可能比地平面低)。经过一段时间的调查,现在他已经知道了最短的路线,我们假设这是一条直线,并且他一定会走这条直线。但是这也太远了,锘爷想找一段开车的时间打瞌睡,为了更舒服的打瞌睡,于是锘爷统计了这条路线上所有的山峰和谷底的高度,他想知道长度为length的路上高度之和最小的一段是多少?

输入

多组数据(不超过50组),处理到文件结束。
对于每组数据,读入一个整数n,length(1<=length<=n<=200000)n表示山峰和低谷数,length表示诺爷打瞌睡的长度。
接下来是n个整数h(i),表示高度,abs(h(i))<=200000。

 

输出

对于每组数据,输出一个整数表示长度为length高度和的最小值。

样例输入

3 2
1 2 3
5 3
1 -1 -1 2 -5

样例输出

3
-4

前缀和

 

问题 H: 杰师傅与锘爷

时间限制: 1 Sec  内存限制: 128 MB
提交: 311  解决: 77
[提交][状态][讨论版]

题目描述

震惊!XDUACM实验室中想起了啪啪啪的声音,杰师傅在一旁沉默。这声音不是键盘声,而是鼠标声!“你萌别打dota了,快去刷题”杰师傅大喊,但是他看了一眼被吓到的锘爷,于是妥协了,就给锘锘出了一道游戏比赛,让锘爷开心。这个是一个回合制游戏,有两群orz熊猫分别为a,b只,每一回合,锘爷和杰师傅轮流进行操作,每次操作可以kill掉s个第一群orz熊猫,或者kill掉t个第二群orz熊猫,其中1<=s<=c,1<=t<=d。最终谁取不了,算谁输!(即就是轮到某个人取了,但是两堆都是0个,无法操作)有爱心的杰师傅决定让锘爷先手,那么请你告诉锘爷他是否能赢,能赢的话输出“NUO!”,不能的话输出“NO!”,没有引号。杰师傅和锘爷绝对聪明,有必胜策略的话,他们不会失误!

 

输入

多组数据(不超过100组),处理到文件结束。
每组数据一行,四个整数a,b,c,d,1<=c<=a<=1000, 1<=d<=b<=1000

 

输出

对于每组数据输出一行,锘爷能赢的话输出“NUO!”,不能的话输出“NO!”,没有引号。

 

样例输入

1 1 1 1
3 2 1 2

样例输出

NO!
NUO!

博弈SG

值得提一下的是,可以dp;

技术分享
 1 /*
 2 #include <bits/stdc++.h>
 3 
 4 using namespace std;
 5 
 6 const int maxn = 1005;
 7 int winning[maxn][maxn];
 8 
 9 int main()
10 {
11     int a,b,c,d;
12     freopen("out.txt","w",stdout);
13     while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
14     {
15         winning[0][0] = false;
16         for(int i=0; i<=a; i++)
17         {
18             for(int j=0; j<=b; j++)
19             {
20                 winning[i][j]=false;
21 
22                 bool flag = false;
23                 for(int s=1; s<=c; s++)
24                 {
25                     if(i>=s&&!winning[i-s][j]) {
26                         winning[i][j] = true;
27                         flag = true;
28                         break;
29                     }
30                 }
31 
32                 if(flag)
33                     continue;
34                 for(int t=1; t<=d; t++)
35                 {
36                     if(j>=t&&!winning[i][j-t]) {
37                         winning[i][j] = true;
38                         break;
39                     }
40                 }
41             }
42         }
43 
44         if(winning[a][b])
45             puts("NUO!");
46         else puts("NO!");
47     }
48 
49     return 0;
50 }
51 */
52 
53 
54 #include <bits/stdc++.h>
55 
56 using namespace std;
57 
58 int a,b,c,d;
59 int sg[1005];
60 bool vis[1005];
61 int SG(int x,int k)
62 {
63     memset(sg,0,sizeof(sg));
64     sg[0] = 0;
65 
66     for(int i=1; i<=x; i++)
67     {
68         memset(vis,0,sizeof(vis));
69         for(int j=1; j<=k&&j<=i;j++)
70             vis[sg[i-j]]=1;
71         for(int j=0;; j++)
72             if(!vis[j])
73             {
74                 sg[i] = j;
75                 break;
76             }
77     }
78     return sg[x];
79 }
80 
81 int main()
82 {
83     while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
84     {
85         int v = 0;
86         v^=SG(a,c);
87         v^=SG(b,d);
88         if(v)
89             puts("NUO!");
90         else
91             puts("NO!");
92     }
93     return 0;
94 }
View Code

 

问题 J: V8与女友

时间限制: 1 Sec  内存限制: 128 MB
提交: 555  解决: 136
[提交][状态][讨论版]

题目描述

那是遥远的公元前2333年,V8还有女朋友的时代。

他和他的女友分别是两个距离遥远的部落的首领,那时候没有现在发达的交通工具和路网,V8每次希望团圆的时候,都要跋山涉水不远万里去会见他的爱人,辛酸的很。经过很多次的旅途,V8掌握了他可以走的所有的路的路线图,毕竟作为首领,不能离开自己的领地太久,所以V8希望你给他找出一条最近的路,并且输出一次往返所需要的最短时间,V8并不会在对方领地停留,说个你好就回来了,需要的时间为0。

虽然不管你求出来有多快,最终V8还是觉得自己在路上花费的时间太多,选择了舍小家而为大家(手动滑稽。

输入

第一行一个正整数t,表示数据的组数(t <=10)。

之后对于每组数据,第一行一个正整数k,表示这个地图(无向图)的路径数(k<=10000)。

之后有k行,每一行三个正整数,s,t,v。表示路的两个端点和这条路需要的时间(s,t,v <=100)。

第k+1行为两个数,v,m,表示V8和他爱人的所在地。

输出

对于每组数据,输出一行一个正整数,为V8一个来回最短的时间(数据保证有通路)。

样例输入

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

样例输出

4

裸最短路

 

以上是关于2017西安电子科技大学第十五届“华为杯”大学生程序设计竞赛网络赛的主要内容,如果未能解决你的问题,请参考以下文章

第十五届全国大学生智能汽车竞赛 讯飞智慧餐厅 全国总决赛竞赛规则

第十五届全国大学生信息安全竞赛(ciscn初赛) 部分writeup

第十五届全国大学生信息安全竞赛(ciscn初赛) 部分writeup

第十五届全国大学生信息安全竞赛知识问答(CISCN)

第十五届全国大学生信息安全竞赛知识问答(CISCN)

第十五届全国大学生信息安全竞赛知识问答(CISCN)