矩阵游戏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. Jsp页面中常用的EL表达式

    首先引入标签 <%@ page language="java" contentType="text/html; charset=utf-8"  pageE ...

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

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

  3. Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树

    Code: 行#include<bits/stdc++.h> #define ll long long #define maxn 1000000 #define inf 100000000 ...

  4. BZOJ 4327: JSOI2012 玄武密码 后缀自动机

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  5. kernel学习单

    lock (spin_lock, mutex, rw_mutex/spinlock) waitqueue, tasklet, softIRQ, hardIRQ basic struct (atomic ...

  6. NOIP2013 DAY2 T3火车运输

    传送门 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况 ...

  7. MYSQL更换密码

    MYSQL5.7以下版本的数据库密码使用的是 mysql这个数据库里的user表的password这个字段, 修改密码只需: 1.update MySQL.user set password=pass ...

  8. BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)

    数组开小毁一生-- 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2085 这题在洛谷上有个条件是"互不包含",其实 ...

  9. OpenCV实现USM锐化与测试

    OpenCV实现USM锐化 [转]http://www.programdevelop.com/4964391/ USM (Unsharp masking) is a common operation ...

  10. 修改oracle客户端的字符集

    客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter, 表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表 方法有 : ...