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. http://blog.csdn.net/ym19860303/article/details/8462450

    http://www.himigame.com/iphone-cocos2d/444.html 很多游戏中,便于开发就会直接采用Cocos2d提供的字体库来使用,但是因为提供的种类很多,那么Himi利 ...

  2. c# 数据库数据与DataGridView表控件的绑定

    public Form1() { InitializeComponent(); //连接数据库 string str = "Data Source=IP;Initial Catalog=数据 ...

  3. Android中Log机制详解

    Android中Log的输出有如下几种: Log.v(String tag, String msg);        //VERBOSELog.d(String tag, String msg);   ...

  4. thinkphp---定义前台视图模板

    具体可以参考: http://document.thinkphp.cn/manual_3_2.html#template_define 方法一:在入口文件中定义 // 定义模板路径 define(&q ...

  5. Iterator 和 Iterable 区别和联系

    首先预览下Java源码中的Iterator和Iterable: Iterable接口: public interface Iterable<T> {//这里只摘录接口中的抽象方法 /** ...

  6. 查看、关闭登录到linux的终端

    基本概念: tty(终端设备的统称):tty一词源于Teletypes,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘和显示器取代,所以现在叫终端比较合适.终端是 ...

  7. MVC学习之HtmlHelper

    1.为什么要使用HtmlHelper? 1.首先HtmlHelper是一个类型,MVC中的ViewPage<TModel>中的一个属性Html属性,这个属性的类型就是HtmlHelper& ...

  8. .net配置404错误页面

    如果你的网站出现一堆让人看不懂的报错,那么你就不是一个合格的程序员,也不是一个合格的站长. 下面的方面可以帮助你的网站远离让人头大的页面. 第一步:配置web.config 打开web.config, ...

  9. Code Forces 652C Foe Pairs

    C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  10. mongodb 的使用

    install: 1.ubuntu用deb安装. 2.下载压缩文件,绿色的,不用安装.   推荐此方法. 配置dbpath: 1.用deb安装的,会在 /etc 目录下 创建mongodb.conf ...