机器翻译

用队列模拟题意即可

#include<cstdio>
#include<iostream>
#include<cstring> using namespace std;
int n,m;
int head=0,tail=0;
int s[1100];
long long ans=0;
bool book[1100];
int main(){
cin>>m>>n;memset(book,0,sizeof(book));
for(int i=1;i<=n;++i){
int a;cin>>a;
if(book[a]==0){
s[++tail]=a;book[a]=1;//入队
if(head+m<=tail)//出队
book[s[head++]]=0;
++ans;
}
}
cout<<ans<<endl;
return 0;
}

乌龟棋

根据题意可以尝试爆搜

30pts

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
long long ans=0;
int a[390];
int b[6];
void dfs(int now,long long fs){
if(now==n) {ans=max(ans,fs);return ;}
for(int i=1;i<=4;++i){
if(b[i]){
b[i]--;
dfs(now+i,fs+a[now+i]);
b[i]++;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i) { int u;cin>>u;++b[u];}
dfs(1,a[1]);
cout<<ans<<endl;
return 0;
}

正解应该用动态规划

定义\(f[i][j][k][l]\)数组,到某个位置用了i张1牌,j张2牌,k张3牌,l张4牌

初始状态:\(f[0][0][0][0]==val[1]\)(val数组记录分数,val[1]为第一张格子的分数)

末状态:\(f[m_1][m_2][m_3][m_4](m_x为第x张牌数量)\)

状态转移方程:

\(t=1*a+b*2+3*c+4*d(a,b,c,d分别为用过的1,2,3,4牌,t为下一步乌龟棋会到达的位置)\)

\(f[i][j][k][l]=min(f[i-1][j][k][l]+val[t],f[i][j][k][l])\)

\(f[i][j][k][l]=min(f[i][j-1][k][l]+val[t],f[i][j][k][l])\)

\(f[i][j][k][l]=min(f[i][j][k-1][l]+val[t],f[i][j][k][l])\)

\(f[i][j][k][l]=min(f[i][j][k][l-1]+val[t],f[i][j][k][l])\)

#include<cstdio>
#include<iostream>
using namespace std;
int n,m;const int maxn=360;
int val[maxn];
int f[111][111][111][111];
int a=0,b=0,c=0,d=0;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&val[i]);
for(int i=1,x;i<=m;++i){
scanf("%d",&x);
if(x==1) ++a;if(x==2) ++b;if(x==3) ++c;if(x==4) ++d;
}f[0][0][0][0]=val[1];
for(int i=0;i<=a;++i)
for(int j=0;j<=b;++j)
for(int k=0;k<=c;++k)
for(int l=0;l<=d;++l){
int t=1*i+j*2+k*3+l*4+1;//乌龟棋下一步能走到那个位置
if(i!=0) f[i][j][k][l]=max(f[i-1][j][k][l]+val[t],f[i][j][k][l]);
if(j!=0) f[i][j][k][l]=max(f[i][j-1][k][l]+val[t],f[i][j][k][l]);
if(k!=0) f[i][j][k][l]=max(f[i][j][k-1][l]+val[t],f[i][j][k][l]);
if(l!=0) f[i][j][k][l]=max(f[i][j][k][l-1]+val[t],f[i][j][k][l]);
}
printf("%d",f[a][b][c][d]);return 0;
}

关押罪犯

(文字量较大建议细读题目)

影响力从大到小排成一个列表

市长只看第一件事

所以可以很容易想到,尽可能把最大值减小

那么因此,(可以贪心)尽量依次拆分两个怒气值最大的两人到两个监狱,遇到两人无法拆开那么就是正确答案(无法拆开说明他们与其他人有更大的c

  • 贪心证明

    假设拆分具有最大值的两人拆到具有最小值,假如遇到两人,可以选择不拆和拆

    如果不拆,此时c一定为最大值,如果拆,则需要考虑两种情况

    拆了之后是否会到与之前拆过的人的监狱

    如果是,那么就不拆,因为到了与之前拆过人的监狱的c一定大于当前c

    如果拆了不会到,那就可拆掉两人,可以减少影响力的最大值

    证毕

    (实力不够,证明瑕疵很多,抱歉)

按影响力c排个序,用并查集记录同一个监狱里的人,又用一个数组记录这个监狱里的对立的人

#include<cstdio>
#include<algorithm> using namespace std;
int n,m;const int maxn=2e4+10;
int f[maxn],d[maxn];//f为并查集,d记录敌人
struct node{
int u,v,w;
}e[maxn*10];
bool cmp(node a,node b){
return a.w>b.w;
}
int find(int x){
if(x!=f[x]) return f[x]=find(f[x]);
return x;
}
bool check(int x,int y){
return find(x)==find(y)?1:0;
}
void unite(int x,int y){
f[find(x)]=find(y);
}
int main(){
scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)f[i]=i;
for(int i=1;i<=m;++i) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;++i){
int u=e[i].u,v=e[i].v;
if(check(u,v)){
printf("%d",e[i].w);
return 0;
}
else {
if(!d[u]) d[u]=v;
else unite(d[u],v);
if(!d[v]) d[v]=u;
else unite(d[v],u);
}
}
printf("0");return 0;
}

引水入城

第一种做法

对于是否具有可行性

只需要dfs或bfs判断一下就ok

对于最少建造几个蓄水厂

也可以用爆搜搜出每个点从上到下能覆盖几个线段,然后贪心线段覆盖即可

至于时间复杂度卡常就可以过去

第二种做法记忆化搜索+dp

记忆化搜索其实就是直接拿搜过的结果用

dp数组的是每个点能到达的最左最右距离

所以要两个数组

l[x][y]=min(l[i][j])(点i,j为点x,y能到达的所有点)

l记录最左端

r记录最右端

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;const int maxn=505;
bool vl[maxn][maxn];
struct node{
int l,r; }d[maxn][maxn];
int mp[maxn][maxn];int cnt=0;
int nt[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
inline int minn(int x,int y){
return x<y?x:y;
}
inline int maxx(int x,int y){
return x>y?x:y;
}
inline int read(){
int x=0,f=1;
char c=getchar();
while(c>'9' || c<'0'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}return x*f;
}
inline int dfs(int x,int y){
vl[x][y]=1;if(x==n) ++cnt;
int nx,ny;
for(int i=0;i<4;++i){
nx=x+nt[i][0],ny=y+nt[i][1];
if(nx<1 || ny<1 || nx>n || ny>m || mp[nx][ny]>=mp[x][y]) continue;
if(!vl[nx][ny])dfs(nx,ny);
d[x][y].l=minn(d[x][y].l,d[nx][ny].l);
d[x][y].r=maxx(d[x][y].r,d[nx][ny].r);
}
}
int main(){
n=read();m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
mp[i][j]=read(),d[i][j].l=0x3f3f3f3f,d[i][j].r=0;
for(int i=1;i<=m;++i)
d[n][i].l=d[n][i].r=i;//dp边界
for(int i=1;i<=m;++i) if(!vl[1][i]) dfs(1,i);
if(cnt!=m){
printf("0\n%d",m-cnt);return 0; //m-cnt为不能建造的水利设施
}int last=1;cnt=0;
while (last<=m){
int maxr=0;
for (int i=1;i<=m;i++)
if (d[1][i].l<=last)
maxr=max(maxr,d[1][i].r);
cnt++;
last=maxr+1;
}puts("1");printf("%d",cnt);return 0;
}

ZFY AK IOI

2010 NOIP提高组题解的更多相关文章

  1. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  2. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  3. NOIP 2001 提高组 题解

    NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...

  4. NOIP 2000 提高组 题解

    NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...

  5. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  6. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

  7. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  8. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  9. 【NOIP2018】提高组题解

    [NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕

随机推荐

  1. kafka简单介绍

    Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...

  2. Vue3全家桶升级指南二ref、toRef、toRefs的区别

    ref是对原始数据的拷贝,当修改ref数据时,模板中的视图会发生改变,但是原始数据并不会改变. toRef是对原始数据的引用,修改toRef数据时,原始数据也会发生改变,但是视图并不会更新. 在vue ...

  3. 3、搭建 rsync备份服务器

    yum install rsync -y rsync(873):数据同步,把一台服务器上的数据以何种权限同步到另一台服务器上,是linux 系统下的数据镜像备份工具.使用快速增量备份工具Remote ...

  4. webpack(4)webpack.config.js配置和package.json配置

    前言 上一篇文章我们使用webpack打包成功了,但是每次都要自己手动输入打包的文件地址和打包到哪里去的地址,非常麻烦,所以这里介绍使用配置文件进行打包 webpack.config.js 首先我们创 ...

  5. SpringCloud:路由ZUUL的配置详解

    以下是两种配置文件的配置方式,可以根据需要选取对自己项目有利的配置. 自定义访问路径(path) 配置application.yml文件 #provider-user:是你的微服务模块的名称,及spr ...

  6. Spring:Spring-AOP简介

    什么是SpringAOP? 将一些相关的编程方法,独立提取出来,独立实现,然后动态地将代码切入到类的指定方法.指定位置上的编程方式就是AOP(面向切面编程). 讲解一下AOP中的相关概念 Aspect ...

  7. linux中如何添加用户并赋予root权限详解

    #adduser username 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anyw ...

  8. Linux云计算-07_Linux文件服务器之vsftpd服务器

    本章向读者介绍企业vsftpd服务器实战.匿名用户访问.系统用户访问及虚拟用户实战等. 1 vsftpd服务器企业实战 文件传输协议(File Transfer Protocol,FTP),基于该协议 ...

  9. Scala学习——面向对象

    Scala面向对象 三大特征:封装.继承.多态 1.类的定义和使用 package top.ruandb.scala.Course02 object Simple { def main(args: A ...

  10. deepin使用synergy鼠标越界软件实现和另一台windows系统共享鼠标

    1,搜索synergy就能找到很多安装和配置的博客文章. 2,我遇到的问题: 1,在linux(deepin)上安装1.8.8版本报出找不到依赖libssl.so.1.0.0的错误,导致无法成功启动软 ...