10.31 NOIP模拟赛 (afternoon)
来源:互联网 发布:python 爬虫 去标签 编辑:程序博客网 时间:2024/05/16 19:36
巧克力棒(chocolate)
Time Limit:1000ms Memory Limit:64MB
题目描述
LYK找到了一根巧克力棒,但是这根巧克力棒太长了,LYK无法一口吞进去。具体地,这根巧克力棒长为n,它想将这根巧克力棒折成n段长为1的巧克力棒,然后慢慢享用。它打算每次将一根长为k的巧克力棒折成两段长为a和b的巧克力棒,此时若a=b,则LYK觉得它完成了一件非常困难的事,并会得到1点成就感。LYK想知道一根长度为n的巧克力棒能使它得到最多几点成就感。
输入格式(chocolate.in)
第一行一个数n。
输出格式(chocolate.out)
一个数表示答案。
输入样例
7
输出样例
4
数据范围
对于20%的数据n<=5。对于50%的数据n<=20。对于80%的数据n<=2000。对于100%的数据n<=1000000000。
样例解释
将7掰成3+4,将3掰成1+2,将4掰成2+2获得1点成就感,将剩下的所有2掰成1+1获得3点成就感。总共4点成就感。
思路:
从样例解释上来看,容易发现把这个巧克力棒分成2^k的长度可以获得更大的成就感,所以可以贪心来做
代码:
#include <cmath>#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;long long A,B;int T;int main(){ freopen("chocolate.in","r",stdin); freopen("chocolate.out","w",stdout); scanf("%I64d",&A); B=A; while (A) {B-=A%2; A/=2;} printf("%I64d\n",B); return 0;}
LYK快跑!(run)
Time Limit:5000ms Memory Limit:64MB
题目描述
LYK陷进了一个迷宫!这个迷宫是网格图形状的。LYK一开始在(1,1)位置,出口在(n,m)。而且这个迷宫里有很多怪兽,若第a行第b列有一个怪兽,且此时LYK处于第c行d列,此时这个怪兽对它的威胁程度为|a-c|+|b-d|。LYK想找到一条路径,使得它能从(1,1)到达(n,m),且在途中对它威胁程度最小的怪兽的威胁程度尽可能大。当然若起点或者终点处有怪兽时,无论路径长什么样,威胁程度最小的怪兽始终=0。
输入格式(run.in)
第一行两个数n,m。接下来n行,每行m个数,如果该数为0,则表示该位置没有怪兽,否则存在怪兽。数据保证至少存在一个怪兽。
输入格式(run.out)
一个数表示答案。
输入样例
3 40 1 1 00 0 0 01 1 1 0
输出样例
1
数据范围
对于20%的数据n=1。对于40%的数据n<=2。对于60%的数据n,m<=10。对于80%的数据n,m<=100。对于90%的数据n,m<=1000。对于另外10%的数据n,m<=1000且怪兽数量<=100。
思路:
典型的二分ans,先预处理一遍,然后放进queue跑BFS具体细节见代码
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#define N 1010using namespace std;int a[N][N],b[N][N],n,m,num,qx[N*N],qy[N*N],vis[N][N];int ax[4]={0,0,1,-1};int ay[4]={1,-1,0,0};bool check(int limit){ memset(vis,0,sizeof(vis)); memset(qx,0,sizeof(qx)); memset(qy,0,sizeof(qy)); int head=0,tail=1; qx[1]=1;qy[1]=1;vis[1][1]=1; while(head<tail){ ++head;int nx=qx[head],ny=qy[head]; for(int i=0;i<4;i++) { int xx=nx+ax[i],yy=ny+ay[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&!a[xx][yy]&&b[xx][yy]>=limit){ ++tail;qx[tail]=xx;qy[tail]=yy;vis[xx][yy]=1; if(xx==n&&yy==m)return true; } } } return false;}void BFS(){ int head=0,tail=num; while(head<=tail) { ++head;int nx=qx[head],ny=qy[head]; for(int i=0;i<4;i++){ int xx=nx+ax[i],yy=ny+ay[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!b[xx][yy]&&!a[xx][yy]){ b[xx][yy]=b[nx][ny]+1; ++tail;qx[tail]=xx;qy[tail]=yy; } } }}int main(){ freopen("run.in","r",stdin); freopen("run.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); if(a[i][j]){qx[++num]=i;qy[num]=j;} } if(a[1][1]||a[n][m]){ printf("0"); return 0; } BFS(); int l=0,r=N*N,ans=0; while(l<=r){ int mid=(l+r)/2; if(check(mid)){ l=mid+1; ans=mid; } else r=mid-1; } printf("%d",ans); return 0;}
仙人掌(cactus)
Time Limit:1000ms Memory Limit:64MB
题目描述
LYK在冲刺清华集训(THUSC)!于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果。如果在一个无向连通图中任意一条边至多属于一个简单环(简单环的定义为每个点至多经过一次),且不存在自环,我们称这个图为仙人掌。LYK觉得仙人掌还是太简单了,于是它定义了属于自己的仙人掌。定义一张图为美妙的仙人掌,当且仅当这张图是一个仙人掌且对于任意两个不同的点i,j,存在一条从i出发到j的路径,且经过的点的个数为|j-i|+1个。给定一张n个点m条边且没有自环的图,LYK想知道美妙的仙人掌最多有多少条边。数据保证整张图至少存在一个美妙的仙人掌。
输入格式(cactus.in)
第一行两个数n,m表示这张图的点数和边数。接下来m行,每行两个数u,v表示存在一条连接u,v的无向边。
输出格式(cactus.out)
一个数表示答案
输入样例
4 61 21 31 42 32 43 4
输出样例
4
样例解释
选择边1-2,1-3,2-3,3-4,能组成美妙的仙人掌,且不存在其它美妙仙人掌有超过4条边。
数据范围
对于20%的数据n<=3。对于40%的数据n<=5。对于60%的数据n<=8。对于80%的数据n<=1000。对于100%的数据n<=100000且m<=min(200000,n*(n-1)/2)。
思路:
这题就很考验大脑,仔细画图分析你会发现编号为i与i+1之间必存在一条边,问题转化成有若干区间,求最多的区间,使得区间之间没有重叠和覆盖。这个问题是可以直接贪心或者dp的。就是经典的线段覆盖问题。
代码:
/* 首先这n个点应该全选(确实不知道为什么) 由题意可知,一定存在一条连接i与i+1的边,因为只存在一个简单环,所以除了i到i+1的边之外,只能有一条边覆盖i到i+1这个位置,这样就转成了线段覆盖问题。*/#include<cstdio>#include<iostream>#include<algorithm>#define N 100010using namespace std;int n,m;struct node{ int x,y;};node e[N*2];bool cmp(const node&s1,const node&s2){ return s1.y<s2.y;}int main(){ //freopen("cactus.in","r",stdin); //freopen("cactus.out","w",stdout); scanf("%d%d",&n,&m); int t=0; for(int i=1;i<=m;i++) { int x,y;scanf("%d%d",&x,&y); if(x>y)swap(x,y); if(x+1!=y)e[++t].x=x,e[t].y=y; } sort(e+1,e+t+1,cmp); int tot=0,p=0; for(int i=1;i<=t;i++) if(e[i].x>=p)p=e[i].y,tot++; printf("%d",tot+n-1); return 0;}
0 0
- 10.31 NOIP模拟赛 (afternoon)
- 10.29 NOIP模拟赛(afternoon)
- 10.30 NOIP模拟赛(afternoon)
- 11.1 NOIP模拟赛 (afternoon)
- 11.2 NOIP模拟赛 (afternoon)
- 11.3 NOIP模拟赛 (afternoon)
- 10.31 NOIP模拟赛(morning)
- 10.30~10.31NOIP模拟赛总结
- NOIP模拟题 10.31
- NOIP模拟10.31
- NOIP模拟10.31 R2
- noip模拟赛 双城记
- 【noip模拟赛】密码
- 10.10NOIP模拟赛
- 10.08NOIP模拟赛
- 10.11NOIP模拟赛
- 10.12NOIP模拟赛
- 10.13NOIP模拟赛
- 欢迎使用CSDN-markdown编辑器
- 求最大公约数和最小公倍数
- c语言实现冒泡排序
- 反射详解!
- (UVA1395)Slim Span(A)
- 10.31 NOIP模拟赛 (afternoon)
- ssh整合(4)Spring与hibernate整合
- (译)LearnOpenGL实际案例Breakout(十):能量块
- 通过自带SSH框架的搭建过程注意和jar包解释
- 233. Number of Digit One
- android 自定义view实现表盘效果
- Linux getpid函数
- 二叉树遍历应用114. Flatten Binary Tree to Linked List
- android graphic(8)—surface申请GraphicBuffer过程