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 思维的更多相关文章

  1. ZOJ 2975 思维

    题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的 一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了 后来想了想 当我们已经确定两个列数的时 ...

  2. [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<= ...

  3. 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys

    题目传送门 /* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排 ...

  4. ZOJ 4124 拓扑排序+思维dfs

    ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...

  5. CF思维联系– CodeForces - 991C Candies(二分)

    ACM思维题训练集合 After passing a test, Vasya got himself a box of n candies. He decided to eat an equal am ...

  6. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  7. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  8. D - The Lucky Week ZOJ - 3939 (思维)

    题目链接: D - The Lucky Week  ZOJ - 3939 题目大意:幸运的星期指,星期一为每个月的1 or 11 or 21号.给出第一个幸运星期的时间,问从当前的日起开始.第n个的日 ...

  9. ZOJ 3992 One-Dimensional Maze(思维题)

    L - One-Dimensional Maze Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & % ...

随机推荐

  1. 【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分

    [BZOJ4149][AMPPZ2014]Global Warming Description 给定一个序列a[1],a[2],...,a[n].请从中选出一段连续子序列,使得该区间最小值唯一.最大值 ...

  2. 【BZOJ4524】[Cqoi2016]伪光滑数 堆(模拟搜索)

    [BZOJ4524][Cqoi2016]伪光滑数 Description 若一个大于1的整数M的质因数分解有k项,其最大的质因子为Ak,并且满足Ak^K<=N,Ak<128,我们就称整数M ...

  3. angular -- ng-ui-route路由及其传递参数?script标签版

    考虑到 多视图等因素,所以 angular 的路由考虑使用 ng-ui-route来做,而不使用 ng-route来做! <!DOCTYPE html> <html lang=&qu ...

  4. 问答项目---用户注册的那些事儿(JS验证)

    做注册的时候,由于每一个页面都有都要可以注册,可以把注册方法写到一个公用的方法里去,其他方法继承这个方法: 简单注册JS示例: <script type='text/javascript'> ...

  5. Css-常用css

    /*怪异盒子模型*/ .box { box-sizing: border-box; } /*水平居中的内联块级*/ .inBlock { display: inline-block; vertical ...

  6. 【转】B2C电子商务系统设计精选

    B2C电子商务系统研发——促销引擎设计(一)(Promotion Engine) B2C电子商务系统研发——商品SKU分析和设计(一) B2C电子商务系统研发——商品SKU分析和设计(二) 电商后台系 ...

  7. 使用C#和HtmlAgilityPack解析HTML

    近期,有一个需求,需要解析HTML页面,读取一些需要的数据后,插入本地数据库.我知道可以通过正则表达式实现,然而正则表达式之于我,就像汇编语言之于我,一样.我知道它是干什么的,我也知道它能干什么,但是 ...

  8. SHFileOperation的用法

    //删除文件或者文件夹bool DeleteFile(char * lpszPath){SHFILEOPSTRUCT FileOp={0};FileOp.fFlags = FOF_ALLOWUNDO ...

  9. 【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符

    1.问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责Lint代码静态检查工作.因此编写了自定义的Lint规则,在调试过程中,编译的时候出现了如下所示的错误: 部分输出日志如下所示: ...

  10. 傅里叶变换 VS 拉普拉斯变换

    拉普拉斯变换的公式 傅里叶变换公式 拉普拉斯变换是将时域映射到s plane上,而傅里叶变换实际是将时域 映射在s-plane的虚轴上, 傅里叶变换可以看作拉普拉斯变换  的一种特例 1.推导傅里叶变 ...