小朋友排队
来源:互联网 发布:dream it possible 编辑:程序博客网 时间:2024/04/28 09:53
这题是一个简单的分治合并。
我最想说的是本来我半年前就做出来这题的,可是找了很久的bug都一直找不到。坑
今天我终于找到了,原来是两个int相乘溢出了,无语+开心。
temp=(a[i].count+1)*a[i].count; //错误点
举个例子吧
#include<cstdio>int n=2147483647;//int的上限int main(){ printf("%d\n",n); long long p; p=2147483647*10;//int溢出 p=n+n; //int溢出,只有把n改为long long才能得到正确结果 printf("%lld\n",p); return 0;}
贴个AC代码
#include<cstdio>#include<cstdlib>#include<ctime>struct children{ int height; long long count; }a[100010]; struct children b[100010];void merge(int start,int middle,int end){ int i=start,j=middle+1,k=start; while(i<=middle&&j<=end) { if(a[i].height>a[j].height) { a[j].count+=middle-i+1; b[k++]=a[j++]; } else { a[i].count+=j-middle-1; b[k++]=a[i++]; } } while(i<=middle) { a[i].count+=end-middle; b[k++]=a[i++]; } while(j<=end) { b[k++]=a[j++]; } for(i=start;i<=end;i++) a[i]=b[i];}void mergesort(int start,int end) { int middle; if(start<end) { middle=(start+end)/2; mergesort(start,middle); mergesort(middle+1,end); merge(start,middle,end); }}int main(void){ srand(time(NULL)); int n; scanf("%d",&n); int i; long long sum=0,temp; for(i=0;i<n;i++) { scanf("%d",&a[i].height); //a[i].height=rand(); //printf("%d ",a[i].height); a[i].count=0; } //printf("\n"); mergesort(0,n-1); for(i=0;i<n;i++) { if(a[i].count>0) { temp=(a[i].count+1)*a[i].count; sum=sum+temp/2; } } printf("%lld\n",sum); return 0;}
如有不当之处欢迎指出!!
0 0
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队
- 小朋友排队--第五届蓝桥杯
- 蓝桥杯 小朋友排队
- 小朋友排队 蓝桥杯
- 历届试题 小朋友排队
- 蓝桥杯 小朋友排队
- 1010-小朋友排队
- 认识css样式以及优势
- Css实现倒三角图标
- 欢迎使用CSDN-markdown编辑器
- java基于rxtx串口操作
- Java下的关键字、保留字
- 小朋友排队
- 深入浅出Android App耗电量统计
- python基础语法(二)
- 习题3-3 乘积的末3位
- git 钩子
- Linux tar
- 和尚挑水(回溯法)
- 计算机网络—关键字总结
- 最小割