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 & % ...
随机推荐
- [Window] .MUS 0x80070422 Error
Window Update 服务没有开启.开启后可以执行如下命令: for /f %%i in ('dir D:\Hotfix\*.msu /S /B /ON') do wusa.exe %%i /q ...
- java的list集合操作List<T>转化List<Long>
java的list集合操作List<T>转化List<Long> package com.google.common.collect; import com.google.co ...
- mysql动态sql 整理多个字段
原始表: 整理后的表: 方案一(动态sql): BEGIN #Routine body goes here... DECLARE v1 ); DECLARE v2 ); #DECLARE v3 VAR ...
- Nginx降权启动
给Nginx服务降权,用lol用户跑Nginx,给开发及运维设置普通账号,只要和lol同组即可管理Nginx,该方案解决了Nginx管理问题,防止root分配权限过大. 开发人员使用普 ...
- 170714、springboot编程之多数据源切换(动态)
(1)新建maven java project; 新建一个maven project,取名为:spring-boot-multi-ds (2)在pom.xml添加依赖包: 在pom.xml文件中加入依 ...
- Object 对象有哪些方法?
这个不看还真不一定能说全,请养成良好的阅读源码和JDK文档的习惯. 总结一下:一共11个,wait的3个+notify的2个,hashCode和equals还有toString共3个,然后clone和 ...
- C++ string append方法的常用用法
append函数是向string的后面追加字符或字符串. 1).向string的后面加C-string string s = “hello “; const char *c = “out here “ ...
- Spring - Bean Definition Bean定义 给容易提供元数据的3方法
Spring Bean Definition https://www.tutorialspoint.com/spring/spring_bean_definition.htm The objects ...
- mysql 数据操作 单表查询 查询排序: order by
如果不指定排序 默认是按照id字段 从小到大排序的 升序 mysql> select * from employee; +----+------------+--------+-----+-- ...
- Spark Shuffle调优原理和最佳实践
对性能消耗的原理详解 在分布式系统中,数据分布在不同的节点上,每一个节点计算一部份数据,如果不对各个节点上独立的部份进行汇聚的话,我们计算不到最终的结果.我们需要利用分布式来发挥Spark本身并行计算 ...