题目链接:http://www.nowcoder.com/test/question/analytic?tid=1667855
第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
一行输出答案。
3 100 2 1 2 3
2
思路:我用两个变量来控制区间的大小,先向前扩展到c的长度,然后左区间向右移动,寻找下一个符合条件的区间;sum用来记录区间和,O(n)
#include<stdio.h> int num[200005]; int main() { int n,t,c; while(scanf("%d%d%d",&n,&t,&c)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&num[i]); } if(c==0){printf("0\n");continue;} int cnt=0; int sum=0; int i=0,j=0; for(;i<n&&j<n;j++) { if(num[j]>t) {sum=0;i=j+1;} if(j-i+1<c) {sum+=num[j];continue;} if(j-i+1>c) {sum-=num[i++];} if(j-i+1==c) { sum+=num[j]; if(sum<=t) cnt++; else if(sum>t) { while(sum>t) { sum-=num[i++]; } } } } printf("%d\n",cnt); } return 0; }
第一行一个数n(2≤n≤1000)表示点数,接下来每行一对整数xi,yi(-1e9<=xi,yi<=1e9)表示网格上的点
一行输出最小面积
2 0 0 0 3
9
//由于必须要沿着网格线剪下,即必须到x、y轴 //so 只有要找最大最小的x,y即可 #include<stdio.h> #include<algorithm> using namespace std; struct point { int x; int y; }po[1005]; int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d%d",&po[i].x,&po[i].y); } int maxx=po[0].x; int minx=po[0].x; int maxy=po[0].y; int miny=po[0].y; for(int i=1;i<n;i++) { maxx=max(maxx,po[i].x); minx=min(minx,po[i].x); maxy=max(maxy,po[i].y); miny=min(miny,po[i].y); } int div=max(maxx-minx,maxy-miny); printf("%d\n",div*div); } return 0; }
第一行五个整数n,m,x,y,t(1≤n,m,t≤1000,1≤x≤n,1≤y≤m); 接下来为一个n*m的矩阵,每行m个一位小数,共n行,第i行第j个数代表坐标为(i,j)的格子钓到鱼的概率为p(0≤p≤1)
输出两行。第一行为概率大的人的名字(cc/ss/equal),第二行为这个概率(保留2位小数)
2 2 1 1 1 0.2 0.1 0.1 0.4
equal 0.20
思路:简单的概率题,首先求<<至少钓到一条鱼的概率=1-一条都钓不到的概率;>>那么现在来求各自钓不到的鱼的概率,cc一直不动,所以很简单,那么ss每次都是随机选择,所以我们要求他的数学期望,在一次选择中不能钓到鱼的概率为1-(每个格子钓到鱼的概率的和 / 总格子数) ;由于是要比较t次,在概率中表示为pow(),最后1-不能的=能的;
#include<stdio.h> #include<math.h> int main() { int n,m,x,y,t; while(scanf("%d%d%d%d%d",&n,&m,&x,&y,&t)!=EOF) { double cc=0.0,ss=0.0; double tmp; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%lf",&tmp); if(i==x&&j==y) cc=1-tmp; ss+=tmp; } } ss=1-ss/(n*m); cc=1-pow(cc,t); ss=1-pow(ss,t); // printf("%f\t%f\n",ss,cc); if(cc==ss) { printf("equal\n%.2f\n",cc); } else if(ss>cc) { printf("ss\n%.2f\n",ss); } else { printf("cc\n%.2f\n",cc); } } return 0; }
第一行N,M,K(2 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。
输出一行,代表所求概率(保留到2位小数)
2 2 1 2 1
0.50
想清楚了,就很简单了。
#include<stdio.h> #include<string.h> int main() { double p[25][25],vis[25][25]; int n,m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(p,0,sizeof(p)); memset(vis,0,sizeof(vis)); int x,y; for(int i=0;i<k;i++) { scanf("%d%d",&x,&y); vis[x][y]=1; } p[1][1]=1; if(vis[1][1]||vis[n][m]) {printf("0.00\n");continue;} for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(i==1&&j==1) continue; if(vis[i][j]) p[i][j]=0; else { if(j==m) p[i][j]+=p[i-1][j]*0.5; if(i==n) p[i][j]+=p[i][j-1]*0.5; p[i][j]+=p[i-1][j]*0.5+p[i][j-1]*0.5; } } } printf("%.2f\n",p[n][m]); } return 0; }