A best fit ring 线段树+DP
给一些点的坐标和点的值,同环的分数要加和,然后询问时要求给出最大值的范围,也就是连续环值最大(最大连续子段和),询问的过程中会有点的值的更改。
code:
#include <cstdio>
#include <iostream>
#include <algorithm>
typedef struct{
int dis;
int v;
int id;
}Node;
Node p[100001]; //存储节点,然后聚合同环节点
int v[100001]; //存储每个节点值,方面,后面更改
int id[100001]; //存储该节点的环值,也就是线段树的叶子编号。
bool cmp(const Node &a, const Node &b)
{
if ( a.dis <= b.dis )
return true;
return false;
}
typedef struct{
int lmax, rmax, max, sum;
int l, r, mid;
}TNode;
TNode tree[400010];
int max(int a, int b)
{
return (a > b ? a : b);
}
void merge(int i)
{
int l = i << 1, r = l + 1;
tree[i].sum = tree[l].sum + tree[r].sum;
tree[i].lmax = max(tree[l].lmax, tree[r].lmax + tree[l].sum);
tree[i].rmax = max(tree[r].rmax, tree[l].rmax +tree[r].sum);
tree[i].max = tree[l].rmax + tree[r].lmax; //最大值出现的三种可能, 左半部分最大值,右半部分最大值,中间最大值
if ( tree[i].max < tree[l].max )
tree[i].max = tree[l].max;
if ( tree[i].max < tree[r].max )
tree[i].max = tree[r].max;
}
void build(int l, int r, int ind)
{
int mid;
tree[ind].l = l;
tree[ind].r = r;
if ( l == r )
{
tree[ind].max = tree[ind].lmax = tree[ind].rmax = tree[ind].sum = p[l].v;
return ;
}
if ( l < r ) //可以不判断
{
mid = tree[ind].mid = (l + r ) >> 1;
build(l, mid, ind << 1);
build(mid+1, r, (ind << 1) + 1);
merge(ind); //合并左右子集
}
}
void insert(int l, int r, int ind, int val)
{
if ( l == tree[ind].l && tree[ind].r == r )
{
tree[ind].max = tree[ind].lmax = tree[ind].rmax = tree[ind].sum = p[l].v;
return ;
}
int mid = tree[ind].mid;
if ( l > mid )
{
insert(l, r, (ind << 1 ) + 1, val);
}
else if ( r <= mid ) //可以不判断,直接 insert(l, r, ind << 1, val);
{
insert(l, r, ind << 1, val);
}
else
{
insert(l, r, ind << 1, val);
insert(l, r, (ind << 1 ) + 1, val);
}
merge(ind);
}
int main()
{
int n;
int x, y;
int i;
int tot;
int m;
char str[10];
while ( scanf("%d", &n ) != EOF )
{
for ( i = 1; i <= n; ++i )
{
scanf("%d%d%d",&x, &y, &p[i].v);
p[i].dis = x * x + y * y;
p[i].id = i;
v[i] = p[i].v;
}
std::sort(p+1, p+1+n, cmp);
id[p[1].id] = 1;
tot = 1;
for ( i = 2; i <= n; ++i )
{
if ( p[i].dis == p[i-1].dis)
{
p[tot].v += p[i].v;
}
else
{
p[++tot].v = p[i].v;
}
id[p[i].id] = tot;
}
build(1, tot, 1);
scanf("%d", &m);
while (m--)
{
scanf("%s", str);
if ( str[0] == 'Q')
{
printf("%d\n", tree[1].max);
}
else
{
scanf("%d%d", &x, &y);
p[id[x]].v = p[id[x]].v - v[x] + y;
v[x] = y;
insert(id[x], id[x], 1, y);
}
}
}
return 0;
}
Shortest Path
DP: 青蛙过河的变种,时间要求很严,1sec。开始在1石头上,要求到n石头上,输出最小步数,不能到达输出-1。
每个石头上有个值r,代表从该石头可以向前最多到达的距离。
按照连续范围遍历的思想,时间复杂度为O(n)。
#include <cstdio>
int dp[100001];
int a[100001];
int max(int x, int y)
{
if ( x > y ) return x;
return y;
}
int main()
{
int tc;
int n;
int i, left ,right, maxright;
int ans;
scanf("%d", &tc);
{
while(tc--)
{
scanf("%d", &n);
for ( i = 0; i < n; ++i )
scanf("%d", &a[i]);
left = 0;
right = 1;
for ( ans = 0; ; ++ans)
{
if ( left >= right )
{
ans = -1;
break;
}
if ( left >= n - 1 || n - 1 < right)
break;
maxright = -1;
for ( i = left; i < right ; ++i )
maxright = max(maxright, a[i] + i + 1);
left = right;
right = maxright;
}
printf("%d\n", ans);
}
}
return 0;
}
play beans
搜索模拟:开始题读错了,认为,要自己枚举产生的空格顺序。题目中已经限定了枚举顺序,从上到下,从左到右。
我在想要是按我的理解的那样,该怎么做这道题???
#include <cstdio>
#include <cstring>
int count(int h, int w, char g[][21])
{
int cnt = 0;
int i , j;
for ( i = 0; i < h; ++i )
for ( j = 0; j < w; ++j )
if ( g[i][j] != '.' )
cnt++;
return cnt;
}
void dis(int h, int w, char g[][21], int i, int j )
{
int fang[4][2] = {{0,1},{0,-1}, {1,0},{-1,0}};
int ii, x, y, c;
int tag[27];
int que[27][2];
for ( ii = 0; ii < 27; ++ii)
tag[ii] = 0;
for ( ii = 0; ii < 4; ii++)
{
x = i + fang[ii][0];
y = j + fang[ii][1];
while ( x >= 0 && x < h && y >=0 && y < w )
{
if ( g[x][y] != '.' )
{
c = g[x][y] -'A';
if ( tag[c] )
{
g[x][y] = '.';
g[que[c][0]][que[c][1]] = '.';
}
else
{
tag[c] = 1;
que[c][0] = x;
que[c][1] = y;
}
break;
}
x += fang[ii][0];
y += fang[ii][1];
}
}
}
void solve(int h, int w, char g[][21])
{
int cnt = count(h,w,g);
char gg[21][21];
int i , j;
for ( i = 0; i < h; ++i )
strcpy(gg[i],g[i]);
for ( i = 0; i < h; ++i )
for ( j = 0; j < w; ++j )
if ( g[i][j] == '.' )
dis(h, w, gg, i, j);
for ( i = 0; i < h; ++i )
strcpy(g[i],gg[i]);
if ( cnt == count(h,w,g) )
return ;
solve(h,w,g);
}
int main()
{
char g[21][21];
int n;
int i;
int h, w;
while (scanf("%d%d", &h, &w) != EOF && h + w)
{
for ( i = 0; i < h; ++i )
scanf("%s", g[i]);
solve(h,w,g);
printf("%d\n",count(h,w,g));
}
return 0;
}
分享到:
相关推荐
【标题】"2013ACM校赛题目"涵盖了计算机科学竞赛中常见的算法和编程挑战,这是一场针对学生编程能力的检验。在这样的赛事中,参赛者需要解决一系列精心设计的问题,这些问题通常涉及数学、逻辑和算法设计。本题目...
为了让大家更好地了解和参与数学建模校赛,我分享了我们学校今年的校赛题目大家可以对比看看和自己学校数学建模校赛的题目有没有什么区别,也可以借鉴一下别人的思路和方法,或者挑战一下自己的能力。这些资源都是...
在ACM(国际大学生程序...对于想要复习或研究2009年ACM校赛题目的人来说,这是一个不可或缺的资料库。通过对这些题目和解题报告的研究,不仅可以提高算法设计能力,还能加深对编程竞赛的理解,为未来的比赛做好准备。
2023校赛题目.rar
"蓝桥校赛题目.pdf" 本资源主要涉及到EDA设计、PCB设计、原理图设计、电子电路等知识点。下面是对标题、描述、标签和部分内容的详细解释: 1. 电子电路基础 问题(1)电容在电路中的功能主要有().A. 滤波B. ...
电赛校赛题目 学习使用.doc
"武汉大学2018数模校赛题目.rar" 是一个压缩文件,其中包含了武汉大学2018年数学建模校级竞赛的题目资料。这个比赛通常会提供一个问题或一系列问题,参赛团队需要运用数学建模的方法来解决。数学建模是一种将实际...
2024年西安外事学院数学建模校赛题目.zip
第十四届兰州理工大学校赛题目.rar
内有re+web+pwn+misc杂项 博文地址:https://blog.csdn.net/m0_64659074/article/details/123853255?spm=1001.2014.3001.5502
很抱歉,但根据提供的信息,我无法生成与IT知识相关的详细内容。标题和描述似乎指的是一个比赛事件,而标签“昆明理”可能是指昆明理工大学,这通常与教育或学术活动有关。然而,压缩包子文件的文件名称列表只包含了...
附件1:2023年重庆邮电大学数学建模竞赛题目.zip
这次的题目可能涵盖了多个领域,如经济、工程、社会学等,涉及的数学工具可能包括微积分、线性代数、概率论、统计学等。 数学建模的过程一般分为以下几个步骤: 1. **理解问题**:首先,你需要仔细阅读题目,理解...
题目加附加文件加答案全套
标题中的“多校的题目”指的是集合了多个学校的算法题目,这通常是在竞赛或学习活动中,为了提升编程技能和算法理解而整理的资源。这样的资料集合可以帮助学习者接触到不同学校、不同风格的算法问题,从而拓宽解决...
首先,理解题目背景和目标至关重要。健身计划的制定涉及到多个因素,包括个人的身体状况、运动目标、时间安排等。参赛者需要深入研究这些因素,并用数学语言进行精确表述。例如,可以通过体质指数(BMI)来量化身体...
【描述】"杭州电子科技大学2009年和2010年电子设计竞赛校赛题目"表明这是一个针对本校学生的比赛,校内竞赛通常具有较高的参与度,因为它们为学生提供了在课堂之外提升技能和实践经验的机会。这些题目可能涵盖多个...
4. 历年试题分析:研究历年竞赛题目,了解命题趋势和评分标准。 二、项目管理: 1. 时间管理:合理安排备赛时间,制定进度计划,确保每个阶段的目标都能按期完成。 2. 风险管理:识别可能遇到的技术难题和风险,...
2021年北京高校数学建模校际联赛题目 某出版社出版发行与初等教育相关的图书, 在运营过程中, 遇到了图书印量、图书销售量和图书库存之间如何协调的问题。在印制图书的时候,除了根据印量会产生纸张费、印刷费、装订...