2017北京林业大学「计蒜客杯」程序设计竞赛部分题解
偶数加成记
时间限制: 2000ms 内存限制: 256M
描述
xyb这里有n个整数。xyb想要得到这n个整数最大的偶数和(即该和为偶数),每个整数最多只能加一次。请你计算出最大的这个值。
输入
输入包含多组。输入的第一个数为一个n(1<=n<=100000)。下一行包括xyb的n个整数,以空格隔开。每个整数的范围为1~10^9。
输出
请输出最大的偶数和。
样例输入1 复制
3
1 2 3
样例输出1
6
样例输入2 复制
5
999999999 999999999 999999999 999999999999999999
样例输出2
3999999996
解题思路:
偶数全部加起来,看奇数多少个,如果是奇数个那么把最小的那个剔除,如果偶数个则全部相加。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <deque>
#include <functional>
#define maxn 100100
#define INF 0x3f3f3f3f
#define N 1010
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll a[maxn];
int main()
{int n;while (~scanf("%d", &n)){ll sum = 0;int cnt = 0;for (int i = 1; i <=n; i++){ll x;scanf("%lld", &x);if (x & 1)a[cnt++]= x;else sum += x;}sort(a, a + cnt, greater<ll>());if (cnt & 1){for (int i = 0; i <cnt - 1; i++)sum +=a[i];}else{for (int i = 0; i <cnt; i++)sum +=a[i];}printf("%lld\n", sum);}return 0;
}
理智逃税
时间限制: 2000ms 内存限制: 256M
描述
xyb在一个高大上的国家工作,这个国家有一个特殊的税收政策。若xyb每年的收入为n元(n>=2),那么xyb所要交的税为n的所有约数中的最大值(不包括n本身。)比如,如果xyb一年收入为6元,那么他就需要交税3元;如果xyb一年收入为25元,那么他就需要交税5元;如果xyb一年收入为2元,那么他就需要交税1元。
然而xyb是个机(jiao)智(hua)的人,他想要上交的税越少越好。所以,他决定,将每年的收入n元,拆分一下:n1+n2+...+nk=n(这里的k表示拆分的份数,k=1也是可以的),然后再将每份所要交的税一起上交即可。当然,对于每份的钱数来说,不能少于2元(如果某一份少于2元他就会被正直的人给揭发了!)
xyb想知道他最少只需要交多少钱的税,你快来帮帮他吧!
输入
输入第一行包含一个整数n(2<=n<=2*10^9),表示xyb的总钱数。
输出
输出一个整数,表示xyb最少需要交多少税。
样例输入1 复制
4
样例输出1
2
样例输入2 复制
27
样例输出2
3
解题思路:
基于哥德巴赫猜想。“对于偶数:一个大于2的偶数可以分为两个质数的和;对于奇数:一个奇数n且不为质数,若其n-2为质数,那么n可以分为两个质数的和,若n-2不为质数,那么n可以分为三个质数的和。”
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
bool isprime(int n)
{for (int i = 2; i*i<=n; i++)if (n%i == 0)return false;return true;
}
int main()
{int n;while (cin >> n){if (isprime(n)){printf("1\n");continue;}if (n % 2 == 0 || isprime(n - 2)){printf("2\n");continue;}printf("3\n");}return 0;
}
我要吃粽子
时间限制: 1000ms 内存限制: 128M
描述
快看!高空中漂浮着好多粽子,而且越高的粽子越大!
好神奇,我要吃到最大的粽子!
地上零零散散放着K种砖块(这些砖块能帮我们吃到高处的粽子)。对于第i类砖块的描述:
1. 第i类砖块,每块高度皆为H。
2. 第i类砖块共有Q个。
3. 第i类砖块,凡是放到高于L的高空会自动消失。
用这些砖块一块块堆砌,以此爬向天空。为了使吃到的粽子尽可能大,问我最高能爬到多高的高空?
输入
有多组数据
每组输入,第一行为一个整数K(1 <= K <= 400)。
第二行为k+1行,每行三个空格分隔的整数H(1 <= H <= 100),L (1 <= L <= 40000),Q(1 <= Q<= 10),表示第i种砖块的H,L,Q。
输出
每组输出一个整数h,表示能吃到的最大粽子所在高度。
样例输入1 复制
3
7 40 3
5 23 8
2 52 6
样例输出1
48
解题思路:
考虑多重背包,不同的是:每次放一个砖要考虑下面又没有东西,不能放在空中
所以先要根据最高度,排序。然后用多重背包递推求解。递推公式:
dp[i][j]=dp[i][j-h[i]] 和 used[i][j]=used[i][j-h[i]]+1 (其中i表示第i种砖块,j表示高度转移,再用used记录一下第i种砖块用的个数)
AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 40010
#define lson root << 1
#define rson root << 1 | 1
#define lent (t[root].r -t[root].l + 1)
#define lenl (t[lson].r - t[lson].l + 1)
#define lenr (t[rson].r - t[rson].l + 1)
#define N 404
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long longull;
int dp[maxn], used[maxn];
struct node
{int h, l, q;friend bool operator< (node a,node b){return a.l < b.l;}
} p[N];
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.txt","r", stdin);freopen("out.txt","w", stdout);long _begin_time = clock();
#endifint k;while (~scanf("%d", &k)){for (int i = 0; i <k; i++)scanf("%d%d%d", &p[i].h, &p[i].l, &p[i].q);sort(p, p + k);memset(dp, 0, sizeof(dp));dp[0] = 1;for (int i = 0; i <k; i++){memset(used, 0,sizeof(used));for (int j = p[i].h; j <= p[i].l; j++){if (used[j - p[i].h] < p[i].q){if (!dp[j]&& dp[j - p[i].h]){dp[j]= dp[j - p[i].h];used[j]= used[j - p[i].h] + 1;}}}}int ans = 0;for (int i =maxn; i >= 0;i--)if (dp[i]){ans =i;break;}printf("%d\n", ans);}
#ifndef ONLINE_JUDGElong _end_time = clock();printf("time =%ld ms.", _end_time -_begin_time);
#endifreturn 0;
}
Universe7去约会
时间限制: 1000ms 内存限制: 128M
描述
Universe7有个非常漂亮的女朋友,他每天都要和她去约会(嫌虐狗?上周末干啥去了!)。他的女友为了考验他,每次都选一个非常神奇的迷宫等他。在迷宫里有许多只蜗牛,如果踩到了蜗牛就会暴毙而亡。但蜗牛会在隔一定的时间消失一秒。其余的时间蜗牛就会待在那里等待大傻子去踩。
下面给出迷宫的地图图例。'.'代表可以走的路,'#'代表蜗牛,'U'代表Universe7的位置,'G'代表他女朋友的位置。每一秒钟,Universe7都可以向上向下向左向右移动一格。
输入
第一行给出样例的总数T(0<T<20),接下来有T个样例。每个样例给出迷宫的行数r列数c和蜗牛消失的间隔时间k(1<=r,c<=100,2<=k<=10)。接下来的r行代表迷宫的地图。
输出
如果Universe7可以成功约会,输出最短时间,否则输出"Please give me another chance!".
样例输入1 复制
2
6 6 2
...U..
...#..
.#....
...#..
...#..
..#G#.
4 4 2
U###
####
####
###G
样例输出1
7
Please give me another chance!
解题思路:
带时间状态的广搜,考虑开三层vis[x][y][z]其中前两层表示坐标,第三层表示时间状态,当t%k==0则表示可进状态。
AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100010
#define lson root << 1
#define rson root << 1 | 1
#define lent (t[root].r -t[root].l + 1)
#define lenl (t[lson].r - t[lson].l + 1)
#define lenr (t[rson].r - t[rson].l + 1)
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long longull;
char mp[110][110];
bool vis[110][110][11];
int dir[4][2] = { { 1, 0 },{ -1, 0 },{ 0, -1 },{0, 1 } };
int r, c, k, ans;
struct node
{int x, y, t;node(int a, int b, int c) { x =a; y = b; t = c; }
};
void bfs(int stax,int stay)
{memset(vis, 0, sizeof(vis));queue<node> q;q.push(node(stax,stay, 0));vis[stax][stay][0] = 1;while (!q.empty()){node cur = q.front();q.pop();if (mp[cur.x][cur.y] =='G'){ans = cur.t;return;}for (int i = 0; i <4; i++){int dx = cur.x + dir[i][0];int dy = cur.y + dir[i][1];int time = cur.t + 1;if (dx >= 0&& dx < r && dy >= 0 && dy < c &&(mp[dx][dy] !='#' || time % k == 0) &&!vis[dx][dy][time % k]){vis[dx][dy][time% k] = 1;q.push(node(dx, dy, time));}}}
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.txt","r", stdin);freopen("out.txt","w", stdout);long _begin_time = clock();
#endifint t;scanf("%d", &t);while (t--){scanf("%d%d%d", &r,&c, &k);int stax, stay;bool flag = 0;for (int i = 0; i <r; i++){scanf("%s", mp[i]);for (int j = 0; j < c&& !flag; j++)if (mp[i][j] == 'U'){stax= i;stay= j;flag= 1;break;}}ans = INF;bfs(stax, stay);if (ans < INF)printf("%d\n", ans);elseputs("Pleasegive me another chance!");}
#ifndef ONLINE_JUDGElong _end_time = clock();printf("time =%ld ms.", _end_time -_begin_time);
#endifreturn 0;
}
读书好多读书读好书
时间限制: 2000ms 内存限制: 256M
描述
xyb刚度过一段繁忙的时期,终于有空闲的时间来读(wan)书(shua)了。今天,他有t分钟的空闲时间来读书。因此,他跑到了图书馆开始他的读书大计。图书馆中有n本书,编号从1~n,xyb读完每本书所花的时间为ai分钟。
xyb决定从随机的一本书开始读,然后一本接一本的读下去。比如,假设xyb决定从第i本书开始读,那么他的读书顺序编号就是i+1,i+2...如果他把自己的空闲时间花光了,那他就不会再读下去了。所以,xyb想请你帮他确定一下读的第一本书的编号,使得他所能读完的书的本数最大(若最后一本书他读不完,则这本书不能算进去),输出他所能读的书本数的最大值。
输入
第一行包含两个整数n,t(1<=n<=10^5,1<=t<=10^9)——n表示图书馆的书本数,t表示xyb的空闲时间(分钟)。
第二行包含n个整数a1,a2,...,an(1<=ai<=10^4),ai表示xyb读完第i本书所需时间(分钟)。
输出
输出一个整数,表示xyb所能读的书本数的最大值。
样例输入1 复制
4 5
3 1 2 1
样例输出1
3
样例输入2 复制
3 3
2 2 3
样例输出2
1
解题思路:用数组存下前缀和,然后遍历过程中,二分往前找。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <deque>
#include <functional>
#define maxn 100100
#define INF 0x3f3f3f3f
#define N 1010
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll a[maxn];
ll sum[maxn];
int main()
{int n, t;while (~scanf("%d%d", &n,&t)){sum[0] = 0;memset(a, 0, sizeof a);for (int i = 1; i <=n; i++){scanf("%lld", &a[i]);sum[i] =sum[i - 1] + a[i];}int ans = 0;for (int i = 1; i <=n; i++){ll res = sum[i] -t;if (res <= 0)ans =i;else{int l = 0, r = i;while (l <= r){int mid = l + r>> 1;if (sum[mid] >=res){ans= max(ans, i - mid);r= mid - 1;}else l = mid + 1;}}}printf("%d\n", ans);}return 0;
}
寻找flash
时间限制: 1000ms 内存限制: 128M
描述
众所周知,flash学长很喜欢玩游戏。今天,他想和大家玩一个捉迷藏的游戏。flash学长会藏在一个矩阵中并且可以使自己名字中的任意字母大写,现在看聪明的你能不能找到flash了。
(在这个矩阵中,如果将字母横着,竖着或者斜着连在一起能组成flash的任意组合便认为是找到了flash)
输入
输入有多组。每组第一个行为两个整数数n,m(n,m<=10),代表矩阵有n行m列。接下来是一个n*m大小的矩阵。
输出
如果flash藏在这个矩阵中,输出yes,否则输出no。
样例输入1 复制
2 5
FeeSh
alabb
1 5
falsh
样例输出1
yes
no
解题思路:
因为n和m很小,直接搜一下就行,dfs或者bfs
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <deque>
#include <functional>
#define maxn 100100
#define INF 0x3f3f3f3f
#define N 1010
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
char mp[20][20];
bool vis[20][20];
int dir[8][2] = { { 1, 0 },{ 0, 1 },{ -1, 0 },{0, -1 },{ -1, -1 },{ -1, 1 },{ 1, -1 },{ 1, 1 } };
int n, m, flag;
struct node
{int x, y, state;node(int a, int b, int c) {x = a;y = b;state = c;}
};
bool judge(int x, int y,int state)
{if (state == 2)return mp[x][y] == 'L' || mp[x][y] == 'l';else if (state == 3)return mp[x][y] == 'A' || mp[x][y] == 'a';else if (state == 4)return mp[x][y] == 'S' || mp[x][y] == 's';return mp[x][y] == 'H' || mp[x][y] == 'h';
}
void bfs(int sx, int sy)
{memset(vis, 0, sizeof(vis));queue<node> q;q.push(node(sx, sy, 1));while (!q.empty()){node cur = q.front();q.pop();if (cur.state == 5){flag = 1;return;}vis[cur.x][cur.y] = 1;for (int i = 0; i <8; i++){int dx = cur.x + dir[i][0];int dy = cur.y + dir[i][1];int state = cur.state + 1;if (dx >= 0&& dy >= 0 && dx < n && dy < m &&!vis[dx][dy]){if (judge(dx, dy, state))q.push(node(dx, dy, state));}}}
}
int main()
{while (~scanf("%d%d", &n,&m)){memset(mp, 0, sizeof(mp));for (int i = 0; i <n; i++)scanf("%s", mp[i]);flag = 0;for (int i = 0; i < n&& !flag; i++)for (int j = 0; j < m&& !flag; j++)if (mp[i][j] == 'F' || mp[i][j] == 'f')bfs(i, j);if (flag)puts("yes");elseputs("no");}return 0;
}
知山知水,树木树人
时间限制: 1000ms 内存限制: 256M
描述
作为一名北林学子,知山知水,树木树人的校训肯定是牢记心中的。xyb也牢记这点。现在,他就在研究k叉树的问题。
对于k叉树,xyb给出了他自己的定义:
1.每个节点(除叶子节点外)都有k个子节点;
2.每条边都具有权值,每个节点下的第i条边的权值为i;
例如,如果是一棵3叉树:
此刻,xyb提出了一个有趣的问题:“从根节点出发,有多少条路径的权值和(即这条路径上所有的权值加起来)是等于n的,且这些路径还要满足一个条件,即经过的所有边,至少有一条边的权值是大于等于d的。”
现在这个问题交给你来解决吧,由于路径数可能会非常大,输出时请对1000000007 (10^9+7)取模。(即%1000000007)
输入
输入为一行。包括三个整数n,k,d(1<=n,k<=100;1<=d<=k),用空格隔开。
输出
输出为一行。即满足条件的路径数对1000000007取模的结果。
样例输入1 复制
3 3 2
样例输出1
3
样例输入2 复制
3 3 3
样例输出2
1
样例输入3 复制
4 3 2
样例输出3
6
样例输入4 复制
4 5 2
样例输出4
7
解题思路:
dp[i][j],i存到和,j==0时,表示到i为止,还没出现过>=d的数,反之,j==1时,则出现过。
然后每层dp一下,状态转移为:
if(j>=d)
dp[i][1]=(dp[i][1]+dp[i-j][0]+dp[i-j][1])%mod
else
dp[i][0]=(dp[i][0]+dp[i-j][0])%mod
dp[i][1]=(dp[i][1]+dp[i-j][1])%mod
AC代码:
#include <bits/stdc++.h>
#define maxn 100100
#define INF 0x3f3f3f3f
#define N 1010
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll dp[110][2];
int main()
{int n, k, d;while (~scanf("%d%d%d%d", &n,&k, &d)){memset(dp, 0, sizeof(dp));dp[0][0] = 1;for (int i = 1; i <=n; i++){for (int j = 1; j <=min(k, i); j++){if (j >= d)dp[i][1]= (dp[i][1] + dp[i - j][0] + dp[i - j][1]) % mod;else{dp[i][1]= (dp[i][1] + dp[i - j][1]) % mod;dp[i][0]= (dp[i][0] + dp[i - j][0]) % mod;}}}cout << dp[n][1] % mod << endl;}return 0;
}
2017北京林业大学「计蒜客杯」程序设计竞赛部分题解相关推荐
- 在线计算机 授课,在线计算机教育网站计蒜客改版 推出算法竞赛课程
[赛迪网讯]4月16日消息,近日,新型在线计算教育平台计蒜客进行了重大改版,网站从底层架构到课程内容都进行了大幅调整.计蒜客新版除了服务速度和稳定性大幅提升外,还对用户的学习体验进行了优化:同时,计蒜 ...
- 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解
第八届"图灵杯"NEUQ-ACM程序设计竞赛个人赛题解 先抱怨一下,这场比赛的题锅太多了,而且正赶上状态不好,Ac 1/12就离谱.. H 数羊 给定n,m(1≤n≤109,0≤m ...
- 2020蓝桥杯B 组省赛计蒜客模拟赛(一)题解
2020蓝桥杯省赛 B 组计蒜客模拟赛(一)目录 试题 A:有趣的数字(结果填空) 试题 B:爬楼梯(结果填空) 试题 C:七巧板(结果填空) 试题 D:苹果(结果填空) 试题 E:方阵(结果填空) ...
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 马踏棋盘的问题
//使用bfs #include<stdio.h> #include<iostream> #include<utility> #include<queue&g ...
- 2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解
A. 寻找字符串 对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x.现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件 ...
- 计蒜客 15499 阿里的新游戏 题解
题意 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.如果一条线段上的三个交叉点都被同一玩家的棋 ...
- 计蒜客 15503 百度的年会游戏 题解
题意 百度年会盛况空前,每个部门的年会活动也是非常有趣.某部门的年会中进行了一个有趣的游戏:一张方桌上有四边,每边可以坐一人,每人面前摆放一排长方形木块.我们一次给四边标号,分别为玩家 1.2.3.4 ...
- 【计蒜客 - A2240】程序设计:轻重搭配 (贪心)
n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票.现在给出了 nn 个人的体重,请你计算他们最 ...
- 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解
前言 由于本人比较菜,只会这十道题,如果哪里写的不对,请在评论区指出,剩下的三道题会尽力去补 比赛连接:https://ac.nowcoder.com/acm/contest/27302 A.大学期末 ...
最新文章
- 使用ASP.NET操作IIS7中使用应用程序
- java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园
- android 时间管理app,时间管理app
- 开发一个简单的工具,导出github仓库所有issue列表
- 如何将Eclipse中的开源项目使用到Android Studio中
- 搜索文献_如何有效地搜索及阅读文献
- java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
- 项目管理系统、工作台、经营看板、质量管理、合同管理、合同审核、新建合同、分包商管理、立项审批、创建项目、项目模板、项目统计、计划管理、结项申请、审批流程、审批记录、审批状态、参数设置、axure原型
- 使用pyinstaller把pyton文件打包成exe文件
- Java构造函数执行顺序
- iphone没有计算机功能,苹果iPad为什么没有计算器应用程序
- matlab对频谱傅里叶逆变换,基于功率谱的傅里叶逆变换问题
- 计算机图解教程视频教程,超详细图文+视频电脑组装教程,装机之家手把手教你组装一台电脑(9)...
- 创建列表、删除列表、查看列表长度、列表增加一个元素的几种方法
- larval-admin
- 用Excel写个摸球模拟器玩玩
- 用拼音输入希腊字母的方法
- LayUi 之 模板引擎
- 电脑检查内存条型号的方法
- Kafka与MySQL的组合使用