noip2010提高组题解

时间:2022-09-04 13:08:13

NOIP2010提高组题解

T1:机器翻译

题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数。

AC做法:直接开1000的队列模拟过程。

T2:乌龟棋

题目大意:有长度为n的棋盘,每个格子对应一个分数,1,2,3,4的卡片共m张,给出四种卡片各自的数量,求改变出牌顺序能获得的最大分数。

思路:开了一个四维的f[i][j][k][l]来表示每张牌有了几张时的最大分数;

F[i][j][k][l]=max(f[i-1][j][k][l],f[i][j-1][k][l],f[i][j][k-1][l],f[i][j][k][l-1])+a[i+2*j+3*k+4*l];

#include <iostream>
#include <memory.h>
using namespace std; int n,m,a[355];
int c[125];
int num[5];
int f[51][51][51][51]; int main()
{
cin >> n >> m;
for (int i=1;i<=n;i++)
cin >> a[i];
for (int i=1;i<=m;i++)
{
cin >> c[i];
num[c[i]]++;
}
for (int i=0;i<=num[1];i++)
for (int j=0;j<=num[2];j++)
for (int k=0;k<=num[3];k++)
for (int l=0;l<=num[4];l++)
{
if (i)
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]);
if (j)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]);
if (k)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]);
if (l)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]);
f[i][j][k][l]+=a[i+2*j+3*k+4*l+1];
}
cout << f[num[1]][num[2]][num[3]][num[4]] << "\n";
}

T3:关押罪犯

题目大意:有n个罪犯要分到2个*,有的罪犯间结怨,如果怨气值为c就会发生影响为c的冲突。求最大冲突的最小值。

思路:用并查集来表示*,将冲突降序排序,冲突大的尽量分开,

直到矛盾,输出矛盾的冲突值即为最大。

#include <iostream>
#include <algorithm>
using namespace std; int n,m;
struct node
{
int a,b,c;
bool operator < (const node &xx) const
{
return c<xx.c;
}
}e[100011];
int x[40011]; int find(int ax)
{
return x[ax]==ax?ax:x[ax]=find(x[ax]);
} int main()
{
cin >> n >> m;
for (int i=1;i<=m;i++)
cin >> e[i].a >> e[i].b >> e[i].c;
sort(e+1,e+m+1);
for (int i=1;i<=n*2;i++)
x[i]=i;
for (int i=m;i>=1;i--)
{
int fx=find(e[i].a);
int fy=find(e[i].b);
if (fx==fy)
{
cout << e[i].c << "\n";
return 0;
}
x[fy]=find(e[i].a+n);
x[fx]=find(e[i].b+n);
}
cout << 0 << "\n";
}

T4:引水入城

题目大意:有n*m的矩阵城市群。。。(→_→)第一排靠湖,第n排靠沙漠,每个城市海拔不同,沿湖城市可以造蓄水厂向海拔低的城市送水,求第n排能否都送到水。

(关于输出)       能:1             不能:0

(最少蓄水厂数)     (无水城市数)

思路:可以先bfs一次,如果最后一行没有全覆盖,顺便输出数量就可以结束了。如果全覆盖了,那么就对每个一线城市进行dfs求出它覆盖的n线城市的连续区间。最后进行区间覆盖。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std; int n,m;
int map[501][501];
int num;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct ct
{
int x,y,h;
}tc,nw;
queue<ct> q;
int v[501][501];
struct xd
{
int l,r;
}g[501];
int f[501];
int now; void dfs(int ax,int ay)
{
v[ax][ay]=1;
if (ax==n)
{
g[now].l = min(g[now].l,ay);
g[now].r = max(g[now].r,ay);
}
for (int i=0;i<4;i++)
{
int xx=ax+dx[i];
int yy=ay+dy[i];
if (xx>n||xx<1||yy>m||yy<1||map[ax][ay]<=map[xx][yy])
continue;
if (!v[xx][yy])
dfs(xx,yy);
}
} int main()
{
cin >> n >> m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin >> map[i][j];
for (int i=1;i<=m;i++)
{
tc.x=1;
tc.y=i;
tc.h=map[1][i];
q.push(tc);
v[1][i]=1;
}
while (!q.empty())
{
nw=q.front();
q.pop();
for (int d=0;d<4;d++)
{
tc.x=nw.x+dx[d],tc.y=nw.y+dy[d];
if (tc.x<1||tc.x>n||tc.y<1||tc.y>m)
continue;
tc.h=map[tc.x][tc.y];
if (!v[tc.x][tc.y] && tc.h<nw.h)
{
q.push(tc);
v[tc.x][tc.y]=1;
}
}
}
int ans=0;
for (int i=1;i<=m;i++)
if (!v[n][i])
ans++;
if (ans>0)
{
cout << "0\n";
cout << ans << "\n";
return 0;
}
cout << "1\n";
for (int i=1;i<=m;i++)
{
memset(v,0,sizeof(v));
now=i;
g[now].l=m+1;
g[now].r=0;
dfs(1,i);
}
f[0] = 0;
for (int i=1;i<=m;i++)
{
f[i]=1<<30;
for (int j=1;j<=m;j++)
if (i>=g[j].l && i<=g[j].r)
f[i]=min(f[i],f[g[j].l-1]+1);
}
cout << f[m] << "\n";
}

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

  1. NOIP2010提高组真题部分整理(没有关押罪犯)

    目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...

  2. NOIP2010提高组乌龟棋 -SilverN

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  3. NOIP 2014 提高组 题解

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

  4. NOIP 2001 提高组 题解

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

  5. NOIP 2000 提高组 题解

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

  6. 【NOIP2018】提高组题解

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

  7. 洛谷 P1541 乌龟棋 &amp&semi; &lbrack;NOIP2010提高组&rsqb;(dp)

    传送门 解题思路 一道裸的dp. 用dp[i][j][k][kk]表示用i个1步,j个2步,k个3步,kk个4步所获得的最大价值,然后状态转移方程就要分情况讨论了(详见代码) 然后就是一开始统计一下几 ...

  8. 洛谷 P1525 关押罪犯 &amp&semi; &lbrack;NOIP2010提高组&rsqb;(贪心,种类并查集)

    传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个*中,第一个不符合的就是答案. 怎样判断是否在一个*中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...

  9. NOIP2010提高组&rsqb; CODEVS 1069 关押罪犯&lpar;并查集&rpar;

    这道这么简单的题目还写了这么久.. 将每个会发生冲突的两人的怒气进行排序,然后从怒气大到小,将两个人放到不同*中.假如两人都已经被放置且在同一*,这就是答案. ------------------ ...

随机推荐

  1. 屏幕取色工具推荐 ColorPix

    很好用的一个屏幕取色工具,方便套页面时,在图片上取色. 用鼠标指到取色未知,按CTRL+C,就可复制16进制的颜色值. 下载地址:http://files.cnblogs.com/zjfree/Col ...

  2. CSS3常用功能的写法

    随着浏览器的升级,CSS3已经可以投入实际应用了. 但是,不同的浏览器有不同的CSS3实现,兼容性是一个大问题.上周的YDN介绍了CSS3 Please网站,该网站总结了一些常用功能的写法. 以下就是 ...

  3. POJ 1979 Red and Black&lpar;水题,递归&rpar;

    一开始理解错题意了,以为是走过的砖不能再重复走,最多能走多少个黑砖,结果写的递归陷入死循环...后来才明白原来可以重复走,问可以到达的磁砖数. #include <iostream> #i ...

  4. !!无须定义配置文件中的每个变量的读写操作,以下代码遍历界面中各个c&num;控件,自动记录其文本,作为配置文件保存

    namespace PluginLib{    /// <summary>    /// 遍历控件所有子控件并初始化或保存其值    /// </summary>    pub ...

  5. LA 3357 &lpar;递推 找规律&rpar; Pinary

    n位不含前导零不含连续1的数共有fib(n)个,fib(n)为斐波那契数列. 所以可以预处理一下fib的前缀和,查找一下第n个数是k位数,然后再递归计算它是第k位数里的多少位. 举个例子,比如说要找第 ...

  6. 意大利进口的衬衫面料pH值严重超标&CenterDot;都市快报

    意大利进口的衬衫面料pH值严重超标·都市快报     意大利进口的衬衫面料pH值严重超标         董捷    2007-03-24           通讯员 浙 检 记 者 董 捷      ...

  7. &lbrack;移动端&rsqb; IOS下border-image不起作用的解决办法

    上周五突然接到现场的一个需求,做一个移动端的劳模展示页面.现场美工把原型图发了过来.这个样子的: 说实在的很想吐槽一下我们美工的审美哈,不过这不是重点. 因为边框是需要特殊花纹的所以打算用border ...

  8. 201521123090《Java程序设计》第12周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 书面作业 将Student对象(属性:int id, String name,int age,double grad ...

  9. Docker&plus;Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果

    为了规范代码,我们一般会集成静态代码检测工具,比如PMD.FindBugs.Checkstyle,那么Jenkins如何集成这些检查工具,并把检查结果放到构建邮件里呢? 今天做了调研和实现,过程如下 ...

  10. &lbrack;ios&rsqb;关于ios开发图片尺寸的建议

    1.以后的应用程序,都使用AutoLayout, 不要再用绝对定位. 2.使用类似网页的方式来设计界面. 3.设计师好,程序员也好,尽量使用点这个单位进行思考,而不要使用像素.比如,你需要做44 x ...