矩阵游戏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的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  5. HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

    描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...

  6. [Offer收割]编程练习赛48

    题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...

  7. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

  8. [Offer收割]编程练习赛5-1 小Ho的防护盾

    #1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...

  9. hiho #1272 买零食 [Offer收割]编程练习赛2

    #1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...

随机推荐

  1. jq 禁用复选框 和输入框

    $('input').attr("readonly", ""); $('input').attr("disabled", "fal ...

  2. Steal 偷天换日 题解(From luoguBlog)

    树形+背包 奇奇怪怪的dp. 考试的时候费了半天劲把题读完后思路基本正解, 然而也不知道为什么脑子鬼畜了一下打了个非递归建树? 而且链式前向星建边? 岔路口和藏品都搞成节点? 自己给自己找麻烦Orz. ...

  3. Tomcat内存分析相关方法(jmap和mat)

    Linux环境命令行 首先,根据进程命令,获取运行的tomcat的进程ID ps aux | grep tomcat | grep java | grep bsc 在第二列可以看到进程ID 然后使用j ...

  4. SPLAY or SPALY ?

    写在前面: 由我们可爱的Daniel Sleator和Robert Tarjan提出的一种数据结构,平衡树的一种,本质是二叉树. 至于到底是splay还是spaly,我认为可能splay更对一些 毕竟 ...

  5. eas启动服务器时非法组件

    EAS实例启动报系统中存在非法组件,实例启动失败:   组件检查机制,要求除了 $EAS_HOME eas\server\lib: $EAS_HOME \eas\server\deploy\files ...

  6. switch 语句的反汇编浅析

    switch 的简单情景(case 不超过 3 项) 首先,我们分析一下 switch 语句的一种简单情景,我们可以用 C 写出如下如下代码. 编译后用 OllyDBG 载入,它将显示出如下的反汇编代 ...

  7. QBXT Day2

    遭遇[问题描述]你是能看到第一题的 friends呢.—— hjaN座楼房,立于城中 .第i座楼,高度 hi.你需要一开始选择座楼,开始跳楼. 在第 i座楼准备跳需要 ci的花费. 每次可以跳到任何一 ...

  8. 洛谷P1141 01迷宫【DFS】

    有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上. 你的任 ...

  9. 洛谷P1478 陶陶摘苹果(升级版)【水题】

    又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s ...

  10. [luogu4026 SHOI2008]循环的债务 (DP)

    传送门 吐槽洛谷难度标签qwq Solution 显然是一道神奇的DP,由于总钱数不变,我们只需要枚举前两个人的钱数就可知第三个人的钱数 DP的时候先枚举只用前k个币种,然后枚举前两个人的钱数,然后枚 ...