偶数加成记

时间限制: 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北京林业大学「计蒜客杯」程序设计竞赛部分题解相关推荐

  1. 在线计算机 授课,在线计算机教育网站计蒜客改版 推出算法竞赛课程

    [赛迪网讯]4月16日消息,近日,新型在线计算教育平台计蒜客进行了重大改版,网站从底层架构到课程内容都进行了大幅调整.计蒜客新版除了服务速度和稳定性大幅提升外,还对用户的学习体验进行了优化:同时,计蒜 ...

  2. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解

    第八届"图灵杯"NEUQ-ACM程序设计竞赛个人赛题解 先抱怨一下,这场比赛的题锅太多了,而且正赶上状态不好,Ac 1/12就离谱.. H 数羊 给定n,m(1≤n≤109,0≤m ...

  3. 2020蓝桥杯B 组省赛计蒜客模拟赛(一)题解

    2020蓝桥杯省赛 B 组计蒜客模拟赛(一)目录 试题 A:有趣的数字(结果填空) 试题 B:爬楼梯(结果填空) 试题 C:七巧板(结果填空) 试题 D:苹果(结果填空) 试题 E:方阵(结果填空) ...

  4. 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 马踏棋盘的问题

    //使用bfs #include<stdio.h> #include<iostream> #include<utility> #include<queue&g ...

  5. 2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解

    A. 寻找字符串 对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x.现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件 ...

  6. 计蒜客 15499 阿里的新游戏 题解

    题意 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.如果一条线段上的三个交叉点都被同一玩家的棋 ...

  7. 计蒜客 15503 百度的年会游戏 题解

    题意 百度年会盛况空前,每个部门的年会活动也是非常有趣.某部门的年会中进行了一个有趣的游戏:一张方桌上有四边,每边可以坐一人,每人面前摆放一排长方形木块.我们一次给四边标号,分别为玩家 1.2.3.4 ...

  8. 【计蒜客 - A2240】程序设计:轻重搭配 (贪心)

    n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票.现在给出了 nn 个人的体重,请你计算他们最 ...

  9. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解

    前言 由于本人比较菜,只会这十道题,如果哪里写的不对,请在评论区指出,剩下的三道题会尽力去补 比赛连接:https://ac.nowcoder.com/acm/contest/27302 A.大学期末 ...

最新文章

  1. 使用ASP.NET操作IIS7中使用应用程序
  2. java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园
  3. android 时间管理app,时间管理app
  4. 开发一个简单的工具,导出github仓库所有issue列表
  5. 如何将Eclipse中的开源项目使用到Android Studio中
  6. 搜索文献_如何有效地搜索及阅读文献
  7. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
  8. 项目管理系统、工作台、经营看板、质量管理、合同管理、合同审核、新建合同、分包商管理、立项审批、创建项目、项目模板、项目统计、计划管理、结项申请、审批流程、审批记录、审批状态、参数设置、axure原型
  9. 使用pyinstaller把pyton文件打包成exe文件
  10. Java构造函数执行顺序
  11. iphone没有计算机功能,苹果iPad为什么没有计算器应用程序
  12. matlab对频谱傅里叶逆变换,基于功率谱的傅里叶逆变换问题
  13. 计算机图解教程视频教程,超详细图文+视频电脑组装教程,装机之家手把手教你组装一台电脑(9)...
  14. 创建列表、删除列表、查看列表长度、列表增加一个元素的几种方法
  15. larval-admin
  16. 用Excel写个摸球模拟器玩玩
  17. 用拼音输入希腊字母的方法
  18. LayUi 之 模板引擎
  19. 电脑检查内存条型号的方法
  20. Kafka与MySQL的组合使用

热门文章

  1. 《笨办法学python》加分习题31——我的答案
  2. MATLAB散点密度图的画法三
  3. 失业日记 10月3日
  4. 从运维技术架构变化初探运维组织转型
  5. app小程序手机端Python爬虫实战06UiSelector文本、className定位方式
  6. SpringCloud项目无法读取bootstrap.yml配置文件的解决办法
  7. python可视化执行幻影坦克
  8. LaTeX各种命令,符号
  9. 老衲与你一起走过。。。
  10. sr550服务器服务器系统安装,sr550服务器阵列配置