矩阵游戏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. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  2. Jenkins 定时 构建项目

    选择要定时构建的 项目-->配置-->构建触发器 触发项目: Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作. ...

  3. KVM之virsh管理虚拟机内存

    调整内存 virsh setmem 命令帮助: [root@ubuntu ~]# virsh setmem --help NAME setmem - change memory allocation ...

  4. PAT_A1013#Battle Over Cities

    Source: PAT A1013 Battle Over Cities (25 分) Description: It is vitally important to have all the cit ...

  5. eoLinker上线两周年+ AMS V4.0 发布:全新UI界面,带来领先的API开发管理解决方案!

    2018年7月,eoLinker 发布了<eoLinker AMS 2018年年中用户调研问卷>,前后经历一周的时间,共收集到超过1000份有效调查问卷.超过300个有效改进意见. eoL ...

  6. pymysql.err.ProgrammingError: (1064)(字符串转译问题)

    代码: sql = "insert into dm_copy(演出类型,演出场馆,剧目名称,演出地点,演出时间,演出票价,演出团体,创建时间, url)values('%s','%s','% ...

  7. TensorFlow学习笔记----例子(2)

    使用TensorFlow中的梯度下降法构建线性学习模型的使用示例:(来源:https://morvanzhou.github.io/tutorials/machine-learning/tensorf ...

  8. 【剑指Offer】2、替换空格

      题目描述:   请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...

  9. Java基本类型转换

    1.自动类型转换 java所有的数值型变量都可以相互转换,如果系统支持把某种基本类型的值直接付赋给另一个基本类型的变量,则这种方式被称为自动类型转换. 当把一个表数范围小的数值或变量直接赋给另一个表数 ...

  10. Git 基础教程 之 创建与合并分支