zoj Candies 思维
http://acm.zju.edu.cn/changsha/showProblem.do?problemId=31
题意:
给你n个非负整数,然后输入n个x[i],x[i] == -1表示第i个数不知道是多少,x[i] != -1表示第i个数是x[i], 然后我们在给出每个数和他左右邻居的和,起点终点只有两个数的和a[i],
输入下标x求x[i]可能取得的最大值,如果x[i]已经知道就输出x[i];
思路:
首先我们分析可以知道x[2],x[5],x[8] ..... 都是已经知道的(下标从零开始), 其次我们只要知道其中的除了x[2],x[5]..这种情况的数的其他任意一个我们都能够求出整个序列,所以如果存在n%3 == 0 || n%3 == 1的情况我们肯定能够利用a[n - 1] = x[n - 1] + x[n - 2]来求出所有序列。 那么未知的就是n%3 == 2的情况了,只要知道其中一个值(除了x[2]..那种情况),我们就能求出所有的序列。如果未知,那么该序列肯定是x[0] = -1, x[1] = -1, x[2] = 已知 ... x[3] = -1, x[4] = -1, x[5] = 已知...的情况,然后模型就可以转化成给你一个序列,知道任意相邻两个序列的和,求该序列中某个值得最大取值。 当然枚举其中一个就能解决问题时间复杂度O(n*m),在本题中不能满足,那么我们就可以假设一个区最小,一个取最大,然后找出取最大值的位置中的最小,这是我们可以移动给另一个所能移动的最多的。然后周处取最小值的里面的最小值,这是我们移动时可以移动的最小的,然后求最值就好了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define keyTree (chd[chd[root][1]][0])
#define Read() freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout); #define M 100007
#define N 100007 using namespace std; int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1}; const int inf = 0x7f7f7f7f;
const int mod = 1000000007; const double eps = 1e-8; int x[N],X[N],a[N],sum[N];
int pos;
int n; int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
CL(x,0);
pos = -1;
for (int i = 0; i < n; ++i)
{
scanf("%d",&x[i]); X[i] = x[i];
if (i % 3 != 2 && x[i] != -1) pos = i;
}
for (int i = 0; i < n; ++i) scanf("%d",&a[i]); x[2] = a[1] - a[0]; X[2] = x[2];
for (int i = 5; i < n; i += 3)
{
x[i] = a[i - 1] - a[i - 2] + x[i - 3];
X[i] = x[i];
} //012 345
if (n % 3 == 0)
{
x[n - 2] = a[n - 1] - x[n - 1];
for (int i = n - 3; i >= 0; --i)
{
x[i] = a[i + 1] - (x[i + 1] + x[i + 2]);
}
} else if (n % 3 == 1) { // 012 345 6
x[n - 1] = a[n - 1] - x[n - 2];
for (int i = n - 3; i >= 0; --i)
{
x[i] = a[i + 1] - (x[i + 1] + x[i + 2]);
}
} else if (n % 3 == 2) { // 012 345 67
if (pos != -1)
{
if (pos % 3 == 0)
{
x[pos + 1] = a[pos + 1] - (x[pos] + x[pos + 2]);
for (int i = pos + 3; i < n; ++i)
{
x[i] = a[i - 1] - (x[i - 1] + x[i - 2]);
}
for (int i = pos - 2; i >= 0; --i)
{
x[i] = a[i + 1] - (x[i + 1] + x[i + 2]);
}
} else if (pos % 3 == 1) {
x[pos - 1] = a[pos] - (x[pos + 1] + x[pos]);
for (int i = pos + 2; i < n; ++i)
{
x[i] = a[i - 1] - (x[i - 1] + x[i - 2]);
}
for (int i = pos - 2; i >= 0; --i)
{
x[i] = a[i + 1] - (x[i + 1] + x[i + 2]);
}
}
}
} int f = 0;
for (int i = 0; i < n; ++i)
{
if (x[i] == -1)
{
f = 1; break;
}
}
int Mi = 0, Ma = inf;
if (f == 1)
{
int cnt = 0;
for (int i = 0; i < n; ++i)
{
if (i%3 == 0)
{
sum[cnt++] = a[i + 1] - x[i + 2];
if (i + 2 < n) sum[cnt++] = a[i + 2] - x[i + 2];
}
}
x[0] = 0; cnt = 0;
int tmp = 0;
for (int i = 1; i < n; ++i)
{
if (i%3 != 2)
{
x[i] = sum[cnt++] - tmp;
if (i % 3 == 1) Ma = min(Ma, x[i]);
else Mi = max(Mi, -x[i]);
tmp = x[i];
}
}
int m,p;
scanf("%d",&m);
while (m--)
{
scanf("%d",&p); if (X[p] != -1) printf("%d\n",X[p]);
else
{
if (p % 3 == 0) printf("%d\n",x[p] + Ma);
else printf("%d\n",x[p] - Mi);
}
}
} else {
int m,p;
scanf("%d",&m);
while (m--)
{
scanf("%d",&p);
printf("%d\n",x[p]);
}
} }
return 0;
}
zoj Candies 思维的更多相关文章
- ZOJ 2975 思维
题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的 一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了 后来想了想 当我们已经确定两个列数的时 ...
- [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]
https://codeforces.com/contest/1056/problem/B 题意:输入n,m 求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...
- 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys
题目传送门 /* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排 ...
- ZOJ 4124 拓扑排序+思维dfs
ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...
- CF思维联系– CodeForces - 991C Candies(二分)
ACM思维题训练集合 After passing a test, Vasya got himself a box of n candies. He decided to eat an equal am ...
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
- D - The Lucky Week ZOJ - 3939 (思维)
题目链接: D - The Lucky Week ZOJ - 3939 题目大意:幸运的星期指,星期一为每个月的1 or 11 or 21号.给出第一个幸运星期的时间,问从当前的日起开始.第n个的日 ...
- ZOJ 3992 One-Dimensional Maze(思维题)
L - One-Dimensional Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & % ...
随机推荐
- Egret Wing4.0.3 动画编辑器
一 exml上摆放组件 切换动画编辑 创建动画组,命名test1. 选中一个对象,创建动画(必须选中一个对象后,+号才会亮.且一个对象只能创建一个动画) 之后和Flash差不多.在时间轴插入关键帧. ...
- Egret3D学习笔记一 (Unity插件使用)
一 官方教程: http://developer.egret.com/cn/github/egret-docs/Engine3D/getStarted/getStarted/index.html 大部 ...
- 【BZOJ3935】Rbtree 树形DP
[BZOJ3935]Rbtree Description 给定一颗 N 个点的树,树上的每个点或者是红色,或者是黑色. 每个单位时间内,你可以任选两个点,交换它们的颜色. 出于某种恶趣味,你希望用最少 ...
- 从零打造在线网盘系统之Hibernate配置O/R映射
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
- 【git】------git开发过程中的使用流程------【巷子】
001.创建仓库 002.新建项目 003.初始化仓库 这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...
- php最全基础,数组,函数,超全局变量,时间,回话,文件,php操作mysql
共享一份学习php最全基础语法知识的笔记 原文链接:http://www.cnblogs.com/oscn/p/3607757.html:略有修改 http://www.cnblogs.com/l ...
- Oracle下Insert的介绍
Insert是插入语句 insert into table(colname1,colname2) values(value1,valu2) 插入无效的会提示失败 数值类型在插入的时候不需要加引号,但是 ...
- TFIDF练习
直接上代码吧: """ 测试Demo """ import lightgbm as lgb import numpy as np from ...
- Asp.NET 与 WebApi 共享Session
首先新建一个.net framework 4.5.2的 web应用程序,选择WebApi基架,包括MVC与Webapi 1.在global.asax中启用Session 2.在HomeControll ...
- MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具
mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...