所有题目链接均来自洛谷

T1机器翻译

原题戳这里

自古T1是水题

因为每一个数字都小于1000,所以对于是否在队列中可以开数组查询

对于大小的限制,弄一个队列维护大小即可(水题呀。。。)

这题在Windows下写的,不要在意缩进

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int ans=0,m,n,a,len=0;
queue<int> Q;
int vis[1001];
int main()
{
cin>>m>>n;
for(int i=1;i<=n;++i)
{
cin>>a;
if(!vis[a])
{
if(len<m)
{
vis[a]=true;
++ans;
Q.push(a);
++len;
}
else
{
vis[a]=true;
++ans;
vis[Q.front()]=false;
Q.pop();
Q.push(a);
}
}
}
cout<<ans<<endl;
return 0;
}

T2乌龟棋

题面戳我

很容易想到DP

很容易可以想到设f[i][j][k][l][m]表示当前走到第i格,对于每张牌分别用了j,k,l,m张

但是这样子很显然会炸空间

继续考虑,如果已经知道每张卡用了多少张,实际上就可以直接计算出当前走到了哪一格,因此第一维可以省去,然后就是一个比较容易的四维DP了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
//f[x][y][z][w]表示
//1步的卡片用x张,2步的卡片用y张
//3步的卡片用z张,4步的卡片用w张
//的时候,能够拿到最大的分数
int f[41][41][41][41];
int n,m;
int A[500],B[5];
int main()
{
n=read();
m=read();
for(int i=1;i<=n;++i)
A[i]=read();
for(int i=1;i<=m;++i)
B[read()]++;
f[0][0][0][0]=A[1];//赋初值
for(int i=0;i<=B[1];++i)
for(int j=0;j<=B[2];++j)
for(int k=0;k<=B[3];++k)
for(int l=0;l<=B[4];++l)
{
int d=A[i+j+j+k+k+k+l+l+l+l+1];
if(i!=0)
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+d);
if(j!=0)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+d);
if(k!=0)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+d);
if(l!=0)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+d);
}
cout<<f[B[1]][B[2]][B[3]][B[4]]<<endl;
return 0;
}

T3关押罪犯

题目在这里

这题有难度了,当时我就搞了好久才弄懂。。。。

如果只说,这道题恐怕也很难说清楚,那么我就尽可能的说清楚。

首先考虑的的是影响力最小,

那么我们就贪心的尽可能解决影响力最大的事件

既然要将人分成两组,那么所有人其实也可以归类为两个集合

一组是和某个人在一个监狱的集合,

另一组是和某个人不在某一个监狱的集合。

现在要考虑的就是解决集合,那么使用并查集

每次解决一组冲突的方法就是将两个人放到不同的监狱,

即将某个人放到另一个人不在一个监狱的集合里面。

如果当前这两个人已经在一个集合中了,那么当前的影响力就是答案,直接输出即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 20010
#define MAXL 100010
using namespace std;
struct Line
{
int x,y,w;
}e[MAXL];
int n,m,f[MAX];
int be[MAX];
inline int getf(int x)
{
return x==f[x]?x:f[x]=getf(f[x]);
}
bool operator <(Line a,Line b)
{
return a.w>b.w;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n*2;++i)
f[i]=i;
for(int i=1;i<=m;++i)
cin>>e[i].x>>e[i].y>>e[i].w;
sort(&e[1],&e[m+1]);
for(int i=1;i<=m;++i)
{
int u=getf(e[i].x);
int v=getf(e[i].y);
if(u==v)//如果在同一个监狱里
{
cout<<e[i].w<<endl;//不可避免的是最大值
return 0;
}
else
{
f[v]=getf(e[i].x+n);
f[u]=getf(e[i].y+n);
}
}
cout<<0<<endl;
return 0;
}

T4引水入城

题面。。。

这道题目拆开讲觉得好简单呀,但是组合在一起觉得有些麻烦了。。。。

首先我们要证明一下如果数据有解的话,每一个地方建造蓄水场,那么它可以影响的旱区的城市一定是一段连续的区间。

既然有解,证明每一个旱区的城市都可以被影响到,

利用反证法,假设存在一个地方供水区间分为两段,中间有一个城市不能够被当前位置影响到。

还是画图吧。。。

也就是这样子

但是中间这个玩意能够被其他的地方覆盖到,也就是这样。

那么这个可以覆盖到的那个蓄水站必然能够影响到左侧的位置

但是它要影响左侧的位置,它的水的覆盖就穿过了原来的那个供水站的影响位置

那么证明当前的供水站其实也是可以覆盖到中间的那个位置的。

如果我还没有讲清楚请画图吧。。。

好了,

现在简单了,对于第一问,直接DFS或者BFS直接覆盖一下位置,检查能否覆盖到所有的干旱地区。

如果可以覆盖的话,上方每一个蓄水站的覆盖区域就是一个线段,

那么可以贪心的求最少的覆盖数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX=501;
int d[4][2]={1,0,-1,0,0,-1,0,1};
bool map[MAX][MAX];
bool book[MAX];
int m,n,g[MAX][MAX];
int L[MAX],R[MAX];
int f[MAX];
struct dsl
{
int L;
int R;
}syc[MAX];
bool cmp(dsl a,dsl b)
{
if(a.L<b.L)return true;
else return false;
}
void DFS(int x,int y)
{
int x1,y1;
for(int i=0;i<4;++i)
{
x1=x+d[i][0];
y1=y+d[i][1];
if(x1>n||x1<=0||y1>m||y1<=0||g[x1][y1]>=g[x][y])continue;
if(map[x1][y1])continue;
map[x1][y1]=true;
DFS(x1,y1);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>g[i][j];
int l,r;
for(int i=1;i<=m;++i)
{
l=MAX;r=0;
memset(map,0,sizeof(map));
map[1][i]=true;
DFS(1,i);
for(int j=1;j<=m;++j)
if(map[n][j])
{
book[j]=true;
if(!map[n][j-1]&&map[n][j])l=j;
if(!map[n][j+1]&&map[n][j])r=j;
}
syc[i].L=l;
syc[i].R=r;
}
int count=0;
bool fl=true;
for(int i=1;i<=m;++i)
{
if(!book[i])
fl=false,++count;
}
if(!fl)
{
cout<<0<<endl<<count<<endl;
return 0;
}
else
{
memset(f,127,sizeof(f));
f[0]=0;
sort(&syc[1],&syc[m+1],cmp);
for(int i=1;i<=m;++i)
for(int j=syc[i].L;j<=syc[i].R;++j)
{
f[j]=min(f[syc[i].L-1]+1,f[j]);
}
cout<<1<<endl;
cout<<f[m]<<endl;
}
return 0;
}

NOIP2010题解的更多相关文章

  1. NOIP2010 题解

    机器翻译 题解:模拟 #include <cstdio> #include <cstring> ; ], ]; int main(){ memset(, sizeof(in)) ...

  2. noip2010提高组题解

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

  3. 题解 【NOIP2010】关押罪犯

    [NOIP2010]关押罪犯 Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突 ...

  4. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  5. noip2010提高组3题题解 by rLq

    本题地址http://www.luogu.org/problem/show?pid=1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和 ...

  6. NOIP2010普及组题解 -SilverN

    三国游戏 题目内容不放了 由于电脑总是会拆掉最大的组合,所以玩家最多只能得到数值第二大的组合 那么找出第二大的组合就行了 #include<iostream> #include<cs ...

  7. NOIP2010 引水入城 题解

    http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...

  8. 【题解】[Noip2010]机器翻译-C++

    题目Description小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章.这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件 ...

  9. luoguP1541 乌龟棋 题解(NOIP2010)

    P1541 乌龟棋 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cma ...

随机推荐

  1. .NET常用第三方库(包)总结

    文章会不定期更新,以下内容均为个人总结,欢迎各位拍砖指正 序列化与反序列化 JSON.NET应该是.NET平台上使用最为广泛的序列化/反序列化包了,ASP.NET和ASP.NET Core中默认序列化 ...

  2. .NET中的按需加载/延迟加载 Lazy<T>

    业务场景: 在项目开发中,经常会遇到特定的对象使用的加载问题,有的实例对象我们创建之后并非需要使用,只是根据业务场景来调用,所以可能会导致很多无效的实例加载 延迟初始化出现于.NET 4.0,主要用于 ...

  3. Windows系统上Redis的安装

    Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...

  4. DxPackNet 5.视频高质量的压缩和传输

    DxPackNet 对视频的压缩和解压也提供了很好的支持,且系统不需要装第三方解码器哦~ 主要用到了 IxVideoEncoder 视频编码器  和 IxVideoDecoder 两个接口 这里只做简 ...

  5. python>oop

    oop即Object Oriented programming,面向对象编程 何为编程:特定的语法+数据结构+算法 编程范式就是从经验中总结的套路: 面向过程编程 适用于简单的脚本,一次任务是极好的, ...

  6. Apple 内购

    关于内购所需东西: 1.测试开发证书:需要打开in-app-purchase,绑定bundleid:com.aragon.TexasPoker 2.iTunes connect 里添加内购应用: 1& ...

  7. 常用校验码(奇偶校验,海明校验,CRC)学习总结

    常用校验码(奇偶校验,海明校验,CRC)学习总结 一.为什么要有校验码? 因为在数据存取和传送的过程中,由于元器件或者噪音的干扰等原因会出现错误,这个时候我们就需要采取相应的措施,发现并纠正错误,对于 ...

  8. HighGUI图形图像界面初步——滑动条的创建和使用

    ---恢复内容开始--- 滑动条是OpenCV动态调节参数特别好用的一种工具,它依附于窗口而存在.由于OpenCV没有实现按钮功能,所以很多时候,我们可以用仅含0-1的滑动条来实现按钮的按下于弹起效果 ...

  9. 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...

  10. 5.1 TLP的格式

    当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去.TLP的基本格式如图5?1所示. 一个完整的TLP ...