[1018NOIP模拟赛]
题目描述 Description###
精灵王国要同侵略 $ Bzeroth $ 大陆的地灾军团作战了。
众所周知,精灵王国有 \(N\) 座美丽的城市,它们以一个环形排列在$ Bzeroth$ 的大陆上。为了补充军需,王国财政部决定从这$ N $ 座城市的商人们腰包中征用物资,其中第$ i $ 座城市的商人们共可以提供 $ A[i] $ 单位的物资。当征粮队征集物资的时候,他们发现一件出乎意料的事情:如果他们征集了第 \(i\) 座城市的物资,那么与第 $i $座城市相邻的两座城市($1 $ 号城市与 \(N\) 号城市相邻)里的商人都会逃跑,即征粮队不能再到这两座城市征集物资。财政部得知这一消息后迅速召开了会议,决定让精灵王国最好的工程师——你,来设计出最优的征集方案,使得联军能够征集到的物资尽可能多。
输入描述 Input Description###
第一行一个正整数$ N $ 。
第二行$ N $ 个正整数,第 i 个数为$ A[i] $ 。
输出描述 Output Description###
输出最优情况下征集到的物资总和。
样例输入 Sample Input###
5
2 3 4 5 5
样例输出 Sample Output###
9
数据范围及提示 Data Size & Hint###
测试数据编号 数据范围 其他限制
1 - 5 2 ≤ N ≤ 20
6 - 7 2 ≤ N ≤ 2501
8 - 9 2 ≤ N ≤ 152501 所有 $ A[i] $均相等
10 2 ≤ N ≤ 152501
对于 100%的数据:$1 ≤ A[i] ≤ 10^9 $ 。
之前的一些废话###
没有废话
题解###
环形灭虫子,先考虑直线情况, $ dp[i][0] $ 表示第i个不选的最大收益,$ dp[i][1] $ 表示第i个选的最大收益,转移的话是\(dp_{i,1}=max\texttt{\{}0,dp_{i-1,0} \texttt{\}}+a_i\),\(dp_{i,0}=max\texttt{\{}dp_{i-1,1},dp_{i-1,0} \texttt{\}};\)
若是环形的话,则强行令端头选,端头不选各DP一次。
代码###
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=152510,oo=2147483647;
int n,a[maxn];
LL dp[maxn][2],ans;
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=read();
dp[1][1]=a[1];dp[1][0]=-oo;
for(int i=2;i<=n;i++)
{
dp[i][1]=max(0ll,dp[i-1][0])+a[i];
dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
}
ans=dp[n][0];
dp[1][1]=-oo;dp[1][0]=0;
for(int i=2;i<=n;i++)
{
dp[i][1]=max(0ll,dp[i-1][0])+a[i];
dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
}
ans=max(ans,max(dp[n][0],dp[n][1]));
printf("%lld\n",ans);
return 0;
}
总结###
没有总结
题目描述 Description###
每一个生活在$ Bzeroth $ 大陆的精灵都知道,若想毁灭他们深爱的这片土地,必须要先摧毁守护 $ Bzeroth $ 大陆的$ N $ 个能量核心。
这 $ N $ 个能量核心由诸神修建的 $ M $ 条秩序神链沟通,其中第$ i $ 条秩序神链沟通了第$ u_i $ 和第 $ v_i $个核心,稳定程度为 $ w_i$ 。最开始,这 $ N $ 个能量核心是连通的(即任意两个能量核心均能通过神链直接或间接沟通)。地灾军团的军师黑袍得知,他们可以摧毁若干神链使得这 $ N $ 个能量核心 恰好被分成两个连通块,从而削弱 $ Bzeroth $ 大陆的防卫能量。由于被摧毁后的防卫能量等于未被摧毁的神链的稳定程度之和,所以他找到了精灵王国最好的工程师,同时也是地灾军团潜伏在 $ Bzeroth $ 大陆多年的间谍——你,来设计出最优的方案,使得未被摧毁的神链的稳定程度之和最小。
输入描述 Input Description###
第一行为 2 个整数 $ N $ 、$ M $ 。
接下来 M 行每行三个正整数 $ u_i $ 、$ v_i $ 、 $ w_i $ 。
输出描述 Output Description###
输出最优情况下未被摧毁的神链的稳定程度之和。
样例输入 Sample Input###
5 5
1 2 1
2 3 2
3 4 3
4 5 4
5 1 5
样例输出 Sample Output###
6
数据范围及提示 Data Size & Hint###
测试数据编号 数据范围 其他限制
1 - 5 2 ≤ N、M ≤ 15
6 - 7 2 ≤ N、M ≤ 152501 2 ≤ N ≤ 15
8 2 ≤ N、M ≤ 152501 M = N - 1
9 2 ≤ N、M ≤ 152501 M = N
10 2 ≤ N、M ≤ 152501
对于 100%的数据:$ 1 ≤ u_i、v_i≤ N,1 ≤ w_i ≤ 10^9 $ 。
之前的一些废话###
没有废话
题解###
随便试一两个图就发现答案是原图的最小生成树-最小生成树上的最大权值边
代码###
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
typedef pair<int,PII> PIP;
#define X first
#define Y second
#define MP make_pair
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=152510,oo=2147483647;
int n,m,a,b,c,f[maxn];
LL sum,MAX;
PIP E[maxn];
int getf(int x){return f[x]==x ? x : f[x]=getf(f[x]);}
void merge(int a,int b)
{
int x=getf(a),y=getf(b);
if(x!=y)f[x]=y;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)a=read(),b=read(),c=read(),E[i]=MP(c,MP(a,b));
sort(E+1,E+m+1);
for(int i=1;i<=m;i++)
{
int u=E[i].Y.X,v=E[i].Y.Y;
if(getf(u)!=getf(v))
{
sum+=E[i].X;
MAX=max(MAX,(LL)E[i].X);
merge(u,v);
}
}
printf("%lld\n",sum-MAX);
return 0;
}
总结###
没有总结
题目描述 Description###
精灵心目中亘古永恒的能量核心崩溃的那一刻,$ Bzeroth $ 大陆的每个精灵都明白,他们的家园已经到了最后的时刻。
就在这危难关头,诸神天降神谕,传下最终兵器——潘少拉魔盒。然而当精灵们准备打开魔盒时,魔盒的守护灵出现在精灵们面前:“如果你们想要拯救世界,必须要先解决这个困难的问题:定义一个 N 阶数列 A 为神奇数列当且仅当对所有$ 2 ≤i ≤ N - 1 $ ,都有 $ A_i-1 + A_i+1 ≥ 2 × A_i $ 。现在有一个$ N $ 阶正整数列$ B $ ,请计算将 $ B $ 数列均匀随机打乱之后,得到的数列是神奇数列的概率 $ P $ 。你只需要输出 $ P × (N!) mod 998244353 $ 的结果即可。(显然 $ P × (N!) $ 一定是个整数)。”
输入描述 Input Description###
第一行为 1 个正整数 $ N $。
第二行为 N 个正整数 $ A_i $。
输出描述 Output Description###
输出 $ P × (N!) mod 998244353 $ 的结果。
样例输入 Sample Input###
4
1 2 1 3
样例输出 Sample Output###
8
数据范围及提示 Data Size & Hint###
对于 50%的数据:3 ≤ N ≤ 10。
对于 80%的数据:3 ≤ N ≤ 20。
对于 100%的数据:3 ≤ N ≤ 40,$ 1 ≤A_i ≤ 10^9 $ 。
之前的一些废话###
没有废话
题解###
发现当且仅当A数组是一个下凸函数时才满足题意
考试时候写的是80分,排个序是肯定的,然后我们确定了最小值,开始往两边依次递增的填数,用 $ 2^n $ 枚举在左边的数,然后判一判是否合法。最后算出总方案数乘以最小数个数的阶乘即可。正解在这基础上稍微改一下即可,往两边插值的时候判断能否插入只与左右两端最大值次大值有关,设计状态 $ dp[i][j][k][l] $ 表示当前序列最左边两个数分别是$ a_i $ 和$ a_j $ ,最右边两个数分别是$ a_k $ 和$ a_l $ 的合法序列数,转移显然。复杂度 \(O(n^4)\)
代码###
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> PII;
typedef pair<int,PII> PIP;
const int MOD=998244353,maxn=42;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,a[maxn],sum=1,jc[maxn],dp[maxn][maxn][maxn][maxn],ans;
int main()
{
n=read();
jc[0]=1;
for(int i=1;i<=n;i++)a[i]=read(),jc[i]=((LL)jc[i-1]*(LL)i)%MOD;
sort(a+1,a+n+1);
for(int i=2;i<=n;i++)
{
if(a[i]!=a[i-1])break;
sum++;
}
for(int i=sum+1;i<=n;i++)a[i-sum+1]=a[i];
dp[1][0][1][0]=1;
n=n-sum+1;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int k=1;k<=n;k++)
for(int l=0;l<k;l++)
{
int pos=max(i,k)+1;
if(pos==n+1){ans=(ans+dp[i][j][k][l])%MOD;continue;}
if(2*a[i]<=a[pos]+a[j] || i==1)dp[pos][i][k][l]=(dp[pos][i][k][l]+dp[i][j][k][l])%MOD;
if(2*a[k]<=a[pos]+a[l] || k==1)dp[i][j][pos][k]=(dp[i][j][pos][k]+dp[i][j][k][l])%MOD;
}
printf("%d\n",((LL)ans*(LL)jc[sum])%MOD);
return 0;
}
总结###
设计DP状态时要充分考虑哪些状态是真正需要用到的。
[1018NOIP模拟赛]的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 小奇模拟赛9.13 by hzwer
2015年9月13日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...
- PKUSC 模拟赛 day1 下午总结
下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...
- [GRYZ]寒假模拟赛
写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
随机推荐
- NAT技术详解
一.IPv4协议和NAT的由来 1.IPv4协议介绍 2011年2月3日,IANA宣布:IPv4地址空间最后5个地址块已经被分配给下属的5个地区委员会.2011年4月15日,亚太区委员会APNIC对外 ...
- [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...
- centos7彻底卸载mysql和通过yum安装mysql
彻底卸载mysql 查看是否有安装的mysql rpm -qa | grep -i mysql // 查看命令1 1 这里写图片描述 yum list install mysql* // 查看命令2 ...
- (三十三)golang--面向对象之继承
继承可以解决代码复用: 实现:只需要在结构体中嵌套一个匿名结构体: 结构体可以使用匿名结构体中所有字段核方法:无论是大写还是小写: 可以简化访问匿名结构体中的属性和方法: 当该结构体和匿名结构体有相同 ...
- 针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
本文大部分内容是针对Refit官网的翻译. 官网地址: https://github.com/reactiveui/refit Refit是一个类似于Retrofit的Restful Api库,使用它 ...
- Kubernetes 有状态与无状态介绍
Kubernetes 有状态与无状态介绍 无状态:deployment - 认为所有pod都是一样的,不具备与其他实例有不同的关系. - 没有顺序的要求. - 不用考虑再哪个Node运行. - 随意扩 ...
- 【洛谷5439】【XR-2】永恒(树链剖分,线段树)
[洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...
- 夜神模拟器怎么连接adb
夜神模拟器连接不了adb的原因主要是adb的版本与夜神模拟器adb版本不一致造成的,具体的解决办法请看下面的操作步骤. 工具/原料 电脑 安装了夜神模拟器 方法/步骤 1 使用快捷键win + ...
- Flask--g属性
目录 Flask之g属性 使用 session,flash,g的区别 Flask之g属性 专门用来存储用户信息的g对象,g的全称的为global g对象在一次请求中的所有的代码的地方,都是可以使用的 ...
- mockjs 在项目中vue项目中使用
一.为什么要使用mockjs 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回的数据,并将随机的模 ...