[Offer收割]编程练习赛33
矩阵游戏II
把每列的数字加起来当一行处理。因为每次操作两列,所以最后最多剩下一个负数。如果负数的个数是偶数,直接所有数字的绝对值加起来即可;若负数个数为奇数,把所有数的绝对值加起来减去其中最小的绝对值的两倍即可。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[][];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
a[][j] += a[i][j];
}
}
int cnt = , ans = , min = ;
for (int i = ; i < n; i++) {
if (a[][i] < ) {
cnt++;
a[][i] = - * a[][i];
}
ans += a[][i];
if (a[][i] < min) {
min = a[][i];
}
}
if (cnt % != ) {
ans -= * min;
}
printf("%d\n", ans);
return ;
}
是二叉搜索树吗?
先判断树:首先判断是不是只有一个点没有父亲,然后判断从这个没有父亲的点dfs能否访问到其他所有的点。
二叉树:每个点最多两个儿子就可以了。
二叉搜索树:左子树最大的点小于根节点,右子树最小的点大于根节点。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> G[];
bool f[];
int n, t;
int max_[], min_[];
bool erchashucuowu() {
for (int i = ; i <= n; i++) {
if (G[i].size() > ) {
return true;
}
}
return false;
}
void dfsmax(int r) {
int ret = r;
for (int i = ; i < G[r].size(); i++) {
dfsmax(G[r][i]);
if (max_[G[r][i]] > ret) {
ret = max_[G[r][i]];
}
}
max_[r] = ret;
}
void dfsmin(int r) {
int ret = r;
for (int i = ; i < G[r].size(); i++) {
dfsmin(G[r][i]);
if (min_[G[r][i]] < ret) {
ret = min_[G[r][i]];
}
}
min_[r] = ret;
}
bool bushisousuoshu(int r) {
if (G[r].size() == ) {
return false;
}
if (G[r].size() == ) {
if (G[r][] < r) {
if (max_[G[r][]] > r) {
return true;
}
} else {
if (min_[G[r][]] < r) {
return true;
}
}
return bushisousuoshu(G[r][]);
}
if (max_[G[r][]] > r) {
return true;
}
if (min_[G[r][]] < r) {
return true;
}
return (bushisousuoshu(G[r][]) || bushisousuoshu(G[r][]));
}
void dfs(int r) {
printf("(");
printf("%d", r);
if (G[r].size() == ) {
printf("()()");
}
if (G[r].size() == ) {
if (G[r][] < r) {
dfs(G[r][]);
printf("()");
} else {
printf("()");
dfs(G[r][]);
}
}
if (G[r].size() == ) {
dfs(G[r][]);
dfs(G[r][]);
}
printf(")");
}
void jianchashu(int r) {
if (f[r]) {
return;
}
f[r] = true;
for (int i = ; i < G[r].size(); i++) {
jianchashu(G[r][i]);
}
}
bool jianchashushu() {
for (int i = ; i <= n; i++) {
if (!f[i]) {
return false;
}
}
return true;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = ; i <= n; i++) {
G[i].clear();
}
memset(f, true, sizeof(f));
for (int i = ; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
G[a].push_back(b);
f[b] = false;
}
for (int i = ; i <= n; i++) {
sort(G[i].begin(), G[i].end());
}
int cnt = , id = -;
for (int i = ; i <= n; i++) {
if (f[i]) {
cnt++;
id = i;
}
}
if (cnt != ) {
printf("ERROR1\n");
continue;
}
memset(f, false, sizeof(f));
jianchashu(id);
if (!jianchashushu()) {
printf("ERROR1\n");
continue;
}
if (erchashucuowu()) {
printf("ERROR2\n");
continue;
}
dfsmax(id);
dfsmin(id);
if (bushisousuoshu(id)) {
printf("ERROR3\n");
continue;
}
dfs(id);
printf("\n");
}
return ;
}
方格取数
动态规划:dp[i][j][k]表示走到第i个斜行,两条路分别位于第i斜行的第j和第k个方格。为保证不相交,设j<k。j和k分别可能由上一行的格子向右或向下走到,共4种前状态,取其中最大值加上jk两个方格中的数字即可。
因为n最大为400,数组开全会MLE。考虑到每次状态转移的时候只会用到i-1中的值,所以可以把dp开成[2][400][400],两个数组轮换使用。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[][], dp[][][];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
scanf("%d", &a[i][j]);
}
}
memset(dp, , sizeof(dp));
dp[][][] = a[][];
for (int i = ; i < * n - ; i++) {
int m = i < n ? i : * n - i;
for (int j = ; j < m; j++) {
for (int k = j + ; k <= m; k++) {
int x1, x2, y1, y2, tmp = , last = (i - ) % ;
if (i <= n) {
x1 = i - j + ;
y1 = + j - ;
x2 = i - k + ;
y2 = + k - ;
if (dp[last][j][k] > tmp) {
tmp = dp[last][j][k];
}
if (dp[last][j - ][k - ] > tmp) {
tmp = dp[last][j - ][k - ];
}
if (dp[last][j][k - ] > tmp) {
tmp = dp[last][j][k - ];
}
if (dp[last][j - ][k] > tmp) {
tmp = dp[last][j - ][k];
}
} else {
x1 = n - j + ;
y1 = i - n + j;
x2 = n - k + ;
y2 = i - n + k;
if (dp[last][j][k] > tmp) {
tmp = dp[last][j][k];
}
if (dp[last][j + ][k + ] > tmp) {
tmp = dp[last][j + ][k + ];
}
if (dp[last][j][k + ] > tmp) {
tmp = dp[last][j][k + ];
}
if (dp[last][j + ][k] > tmp) {
tmp = dp[last][j + ][k];
}
}
dp[ - last][j][k] = tmp + a[x1][y1] + a[x2][y2];
}
}
}
printf("%d\n", dp[][][] + a[n][n] * + a[][]);
return ;
}
单词接龙
这题思路是想好了,代码实现起来太费时间,手太慢不写了。
设f[i]表示以第i个单词开始能往后构造的长度。
从单词s开始可以把26个字母分别加在左边或右边,共52种可能的接龙方式。从这52个f值中选一个最大的加1即可。因为顺序没法确定,所以用dfs来算:for (int i=0;i<n;i++) dfs(i);
题目中直说单词总长度小于1000000,没说每个单词最大长度,很讨厌。
每个单词的52种扩展中不一定全在字典里,所以要用一个Trie树来判断。因为单词很长,所以不能一个词一个词的分开存,只能全存在一个数组里然后记录各个端点,用的时候sscanf。
[Offer收割]编程练习赛33的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
- [Offer收割]编程练习赛48
题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
- hiho #1272 买零食 [Offer收割]编程练习赛2
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
随机推荐
- MVC控制器返回值
public ActionResult Index(string id)//主页 //参数string searchString 访问方式为index?searchString=xxxx .参数str ...
- java HttpURLConnection 登录网站 完整代码
import java.io.*; import java.util.*; import java.net.*; public class WebTest { public static void m ...
- Postgresql_最新版11.2源码编译安装
pg官网:https://www.postgresql.org/ yum -y gcc gcc-c++ cmake ncurses-devel perl zlib* .去官网下载源码包. 下载地址:h ...
- SGU495Kids and Prizes 数学期望
题意: 有n个奖品,m个人排队来选礼物,对于每个人,他打开的盒子,可能有礼物,也有可能已经被之前的人取走了,然后把盒子放回原处.为最后m个人取走礼物的期望. 题解: 本道题与之前的一些期望 DP 题目 ...
- Android 性能测试初探(五)
书接上文 Android 性能测试初探之 GPU(四) 前文说了的一些性能测试项大家可能都听说,接下来我们聊聊大家不常关注的测试项- 功耗 . 功耗测试主要从以下几个方面入手进行测试 测试手机安装目标 ...
- bos开发时,测试卡在登录界面解决
在BOS工作空间工程路径下新建sp文件夹,如在E:\bosworkspace8.2\Project_0\lib 新建sp文件夹E:\bosworkspace8.2\Project_0\lib\sp.然 ...
- docker安装部署
1. 如何安装 Epel源到 RHEL/CentOS 7/6/5? RHEL/CentOS rpm -ivh http://mirrors.ustc.edu.cn/epel/7/x86_64/Pack ...
- jupyter记事本的安装和简单应用
1.概述 jupyter记事本是一个基于Web的前端,被分成单个的代码块或单元.根据需要,单元可以单独运行,也可以一次全部运行.这使得我们可以运行某个场景,看到输出结果,然后回到代码,根据输出结果对代 ...
- 【ZOJ 4070】Function and Function
[链接] 我是链接,点我呀:) [题意] [题解] 递归一会. 会发现最后肯定是0,1一直循环. 开始循环之后就直接返回结果就好. [代码] #include <bits/stdc++.h> ...
- 重命名文件及html
import os import nltk from bs4 import BeautifulSoup as bs def get_txt_name_from_bak_name(bak_name): ...