矩阵游戏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. POST请求成功,但接口返回数据不正确

    事件:使用Jmeter做APP的搜索接口测试,请求成功了,但无论keyword是什么“内容”(这里的内容是带引号的哦),接口返回的内容都是:未匹配到搜索结果 排查问题: keyword=“世界” st ...

  2. EF6 mysql配置

    如何把一个ef项目 从sqlserver改为mysql 首先在引入了ef的层再引入这两个包,注意两个的版本一定要一样,一定要一样,一定要一样,不然就会报错 MySql.Data.Entity目前的最新 ...

  3. typora与Markdown的一些小问题

    一.typora中修改图像大小 加上style="zoom:50%" <img src="E:\GitHub_learn\blog\source\imgs\tree ...

  4. UDP、线程、mutex锁(day15)

    一.基于UDP的网络编程模型 服务器端 .创建socket. .将fd和服务器的ip地址和端口号绑定 .recvfrom阻塞等待接收客户端数据 .业务处理 .响应客户端 客户端: .创建socket ...

  5. 深入C++的运算符重载

    对于简单的运算符,可以参考之前的博文.之后会有一篇关于从等号运算符重载的角度研究深浅拷贝的博文.这里是讲:逗号,取成员运算符,输入输出运算符,下标运算符,括号,new和delete的重载. 逗号运算符 ...

  6. phpcms_完整版

    {pc:content action="category" catid="0" num="6" siteid="$siteid&q ...

  7. [bzoj2748][HAOI2012]音量调节_动态规划_背包dp

    音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...

  8. i386和x86-64区别通俗易懂版本(转)

    x86架构首度出现在1978年推出的Intel 8086中央处理器,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.Intel之后又推出了包括80186.80 ...

  9. RabbitMQ发布订阅实战-实现延时重试队列

    RabbitMQ是一款使用Erlang开发的开源消息队列.本文假设读者对RabbitMQ是什么已经有了基本的了解,如果你还不知道它是什么以及可以用来做什么,建议先从官网的 RabbitMQ Tutor ...

  10. POJ 3608

    1.计算P上y坐标值最小的顶点(称为 yminP )和Q上y坐标值最大的顶点(称为 ymaxQ). 2.为多边形在 yminP 和 ymaxQ 处构造两条切线 LP 和 LQ 使得他们对应的多边形位于 ...