半期考之后,磨磨蹭蹭的刷了两套长乐的模拟题【=-=我现在实在是不敢恭维自己的刷题速度】
感觉貌似很久没有来这里喂食了,就顺便yy下题解好了
2013.2.A:
ice :BFS和spfa都可以,我打了个spfa顺便复习了一【ps:不懂自己在想什么,用cena的时候配置配错了,无限wa啊,=-=之后测了一下标程,不明觉厉】
promotion: DP 感觉自己DP一直都不太会【或许是因为没有很系统的学习】 然后大概想了一下F[I][J]要填什么 大概yy出来之后 貌似调得蛮久的
book :这是之前我在学二分算法的时候打的一题 记得当时模拟写挂了【差点哭瞎】
2013.3.A
country :纯模拟,没有什么好说的【当时自己忘记判在同一个圆的情况,=-=WA的特忧伤】
dec:二分答案+排序【还有这里需要预处理一下把相同的数放在同一集合里】【排序完之后二分找到a+c=b的就可以了】
couple number: 看得第一眼以为是有点厉害的数论 之后发现就是奇数和4的倍数嘛【不到15行=-=整个人都不好了】
3.A的题略水一些
扔上题目和代码=-=
题1 冰岛 【问题描述】 假设你在一个n*n的冰面上,并且你想到达这个冰面的某处,可是由于冰面太滑了,所以当你向某个方向出发后,你没有办法使自己停下来直到你碰到了某个障碍物——因为你可以抓住障碍物使得你的身体停止运动。 因为你已经知道了整个地图,所以你决定在行动之前先计算出最快可到达目标的路线,使得你可以不用走太多冤枉路,这时你决定编程解决这个问题…… 【输入格式】 第一行包括一个正整数n(n<=1000) 以下n行,每行包括n个数字(0或1),0表示该点为空地可以滑行,1表示该点为障碍物(障碍物无法穿过)。保证最外圈的地形为障碍物,也就是你无法离开这个地图。 接下来1行包括2个整数x,y(1<=x,y<=n),表示一开始你处于坐标(x,y) 再接下来1行包括2个整数x2,y2(1<=x2,y2<=n),表示你想要到达的目标为(x2,y2) 【输出格式】 只有一个整数t,表示能到达目标的最短时间(假设每经过一次滑行需要花费1单位的时间,无论这次滑行距离的长短)。所谓到达目标要求必须停留在(x2,y2),也就是你不能在到达之后被迫滑向下一个点。当你无法到达目标点时,你只须输出一行字符串’impossible’。 【输入样例1】 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 2 3 【输出样例1】 说明:由(2,2)到(2,3),再由(2,3)到(4,3),2次滑行到达终点。 【输入样例2】 1 1 1 1 0 1 1 1 0 1 1 1 1 2 3 【输出样例2】 impossible 【数据范围】 20%数据满足 n<=5 40%数据满足 n<=10 60%数据满足 n<=200 100%数据满足 n<=1000 题2 保送 【题目背景】 yk同学赫赫有名,为什么呢?因为他参加了若干竞赛,所以认识无数大朋友和小盆友。可是无数大朋友和小盆友也都认识他,为什么呢?因为yk同学实在是太牛了~ 我们甚至经常可以在路上听到同学之间的典型谈话: 小A:你认识yk吗? 小B:当然认识啦,就是那个XX竞赛班的大牛哇~ 小A:他不光是XX竞赛班的神牛,还是XXX竞赛班的神牛呢~ 小B:哦~~ 然后小A小B一起无限膜拜中…… 那么,yk同学到底神到什么地步呢? 世界上总共有N门竞赛,yk同学参加了全部,并且都能拿到保送!!运气好的时候呢,还能拿到一等奖!!怎么样,厉害吧~~ 【题目描述】 现在有N门竞赛,yk同学对于不同学科有不同的概率拿到一等奖。现在yk想知道,他有多少的概率至少拿到M个一等奖。 【输入格式】promotion.in 第一行两个用空格隔开的正整数N,M 下面N行,每行一个0~1的实数,第i+1行的实数表示第i门科目得到一等奖的概率。 【输出格式】promotion.out 一行一个实数,表示至少得到M门一等奖的概率。实数保留六位小数。 【输入样例1】promotion.in 1 1 【输出样例1】 1.000000 【输入样例2】 1 0.046921 0.959868 0.008229 【输出样例2】 0.962066 【数据范围】 100% M<=N<=20 题3 任务分配 【问题描述】 图书馆按顺序排列有N本书需要维护,每本书的总页数不相同。现有M位员工。可以给每个员工分配连续的一段书籍,让他进行维护。现在的问题是,怎么样分配,工作任务最重(需要维护的页数最多)的人维护的页数尽量少。 【输入格式】 第一行两个数,N、M。接下来N行,每行一个整数,表示一本书的页数。 【输出格式】 任务最重的人最少需要维护的页数。 【输入样例】 3 2 1 【输出样例】 【数据范围】 20%数据:N<=1000 30%数据:N<=10000 100%数据::N<=100000,M<=N。一本书的页数最多10000。 题1 圆国旅行 【问题描述】 圆国是一个国家,它包含几个圆形地区。有些地区可能位于内其他地区,但其边界不相交或触摸。 Qatam是圆国的乡村居民。当他在两个地点之间旅行,他总是试图跨越过尽可能少的边界地区,因为跨越地区边界通常是费力的任务。 【输入】 输入文件名为country.in。有多组测试数据: 第一行,包含一个整数Num,表示测试数据的个数。(1<=Num<=10) 每组测试数据,第一行一个整数N,表示共有N个地区。1<=N<=50. 接下来三行,每行N个整数,前两行分别表示每个地区的x坐标和y坐标[-1000,1000],第三行表示该地区圆的半径r[1,1000]。 最后4个整数,分别表示Qatam的起点和目标点x1,y1,x2,y2[-1000,1000]。 【输出】 输出文件country.out共Num行,最少穿过的边界数目。 【输出输出样例】 country.in country.out 0 2 -5 1 5 1 0 -6 6 1 2 2 2 -5 1 5 1 1 -3 2 5 -4 12 12 -1 2 5 5 1 1 1 2 1 1 1 2 -5 1 12 1 -3 2 2 0 -4 12 12 12 -1 2 3 1 5 1 1 1 3 1 7 1 1 2 3 3 13 2 -107 -38 140 148 -198 172 -179 148 176 153 -56 -187 -115 23 -2 -49 -151 -52 42 0 68 109 -174 42 70 39 89 39 43 150 10 120 16 8 16 19 -108 0 3 3 题2 A-B 【问题描述】 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对) 【输入格式】 第一行包括2个非负整数N和C,中间用空格隔开。 第二行有N个整数,中间用空格隔开,作为要求处理的那串数。 【输出格式】 输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。 【输入输出样例】 dec.in dec.out 1 1 2 3 3 【数据规模】 对于90%的数据,N <= 2000; 对于100%的数据,N <= 200000。 所有输入数据都在longint范围内。 题3 Couple Number 【问题描述】 任何一个整数N都能表示成另外两个整数a和b的平方差吗?如果能,那么这个数N就叫做Couple number。你的工作就是判断一个数N是不是Couple number。 【输入格式】 仅一行,两个长整型范围内的整数n1和n2,之间用1个空格隔开。 【输出格式】 输出在n1到n2范围内有多少个Couple number。 注意:包括n1和n2两个数,且n1<n2,n2 - n1 <= 10 000 000。 【输入样例】 10 【输出样例】 7
ice:
#include<cstdio> #include<cstring> using namespace std; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; long long vis[1010][1010],d[2000001][3],n,h=1,w=1; bool s[1010][1010]; void SPFA(int x,int y,int xx,int yy){ int t,l; d[1][0]=x;d[1][1]=y; vis[x][y]=0; while(h<=w){ for(int i=0;i<4;i++){ t=d[h][0]+dx[i]; l=d[h][1]+dy[i]; if(s[t][l]) continue; while(!s[t+dx[i]][l+dy[i]]){ t+=dx[i]; l+=dy[i]; } if(x==t && y==l) continue; if(vis[t][l]!=0) continue; vis[t][l]=vis[d[h][0]][d[h][1]]+1; w++; d[w][0]=t;d[w][1]=l; if(t==xx && l==yy) return; } h++; } } int main() { int x,y,xx,yy; freopen("ice.in","r",stdin);freopen("ice.out","w",stdout); memset(d,0,sizeof(d)); memset(vis,0,sizeof(vis)); scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++){ scanf("%d",&x); s[i][j]=x; } scanf("%d%d",&x,&y); scanf("%d%d",&xx,&yy); SPFA(x,y,xx,yy); if(vis[xx][yy]!=0) printf("%d\n",vis[xx][yy]); else { if(x==xx && y==yy) printf("0\n"); else printf("impossible\n"); } return 0; }
promotion:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; double f[30][30],a[30],ans=0; int n,m; int main(){ freopen("promotion.in","r",stdin);freopen("promotion.out","w",stdout); scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ cin>>a[i]; } f[0][0]=1; for (int i=1;i<=n;i++) { f[i][0]=f[i-1][0]*(1-a[i]); for (int j=1;j<=i;j++) f[i][j]=f[i-1][j]*(1-a[i])+f[i-1][j-1]*a[i]; } for (int i=m;i<=n;i++) ans+=f[n][i]; printf("%.6lf",ans); return 0; }
book:
#include<cstdio> #include<cstring> using namespace std; int a[100001],n,m; bool check(int x){ int now=x,num=0; for (int i=0;i<n;i++){ if (x<a[i]) return false; if (now-a[i]<0){ now=x; num++; now-=a[i]; if (num==m) return false; } else now-=a[i]; } return true; } int main(){ int i,j,s,t,tot=0; //freopen("book.in","r",stdin);freopen("book.out","w",stdout); scanf("%d%d",&n,&m); for (i=0;i<n;i++){ scanf("%d",&a[i]); tot+=a[i]; } int r=tot,l=0; while (l<=r){ int mid=(l+r)>>1; if(check(mid)) r=mid-1; else l=mid+1; } printf("%d",l); return 0; }
country:
#include<cstdio> #include<cstring> using namespace std; int n,m,x[501],y[501],r[501],print[501],fx,fy,ex,ey,min,t; void check(int x,int y,int r,int a,int b){ if((x-a)*(x-a)+(y-b)*(y-b)<r*r){ min++;++t; } } int main(){ freopen("country.in","r",stdin);freopen("country.out","w",stdout); scanf("%d",&n); for(int i=0;i<n;i++){ min=0; memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(r,0,sizeof(r)); scanf("%d",&m); for(int j=0;j<m;j++) scanf("%d",&x[j]); for(int j=0;j<m;j++) scanf("%d",&y[j]); for(int j=0;j<m;j++) scanf("%d",&r[j]); scanf("%d%d%d%d",&fx,&fy,&ex,&ey); for(int k=0;k<m;k++){ t=0; check(x[k],y[k],r[k],fx,fy); check(x[k],y[k],r[k],ex,ey); if(t==2) min-=2; } print[i]=min; } for(int i=0;i<n;i++) printf("%d\n",print[i]); return 0; }
dec:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=2000001; long long a[MAXN],num[MAXN],n,ans=0,c,l,r,mid; int main(){ freopen("dec.in","r",stdin); freopen("dec.out","w",stdout); scanf("%d%d",&n,&c); memset(num,0,sizeof(num)); for(int i=0;i<n;i++){ scanf("%d",&a[i]); num[a[i]]++; } sort(a,a+n); for(int i=1;i<n;i++){ l=1;r=i-1; while(l<=r){ mid=(l+r)>>1; if(a[i]-a[mid]>c) l=mid+1; else{ if(a[i]-a[mid]<c) r=mid-1; else{ ans=ans+num[a[mid]]; break; }}}} printf("%d",ans); return 0; }
couple
#include<cstdio> #include<cstring> #include<cmath> using namespace std; long long n,m,ans=0; int main(){ freopen("couple.in","r",stdin); freopen("couple.out","w",stdout); scanf("%d%d",&n,&m); for(int i=n;i<=m;i++){ if(i%4==0 || i%2!=0) ans++; } printf("%d",ans); return 0; }