XMU 1608 nc与加法进位 【二分】

1608: nc与加法进位

Time Limit: 2000 MS  Memory Limit: 128 MB
Submit: 29  Solved: 27
[Submit][Status][Web Board]

Description

nc最近很无聊~所以他总是想各种有趣的问题来打发时间。
nc喜欢做加法运算,他对加法进位很感兴趣。现在给你n个数字,他想知道,这些数字两两相加,一共会出现多少次加法进位。

Input

第一行包含1个整数n,表示有n个数字。(n<=5000)
第二行包含n个数字,分别表示a1,a2,...an。(0?≤ai?≤?10^9).

Output

这些数字两两相加,出现加法进位次数。

Sample Input

3
43 58 85

Sample Output

5

HINT

Source

by cjf

[Submit][Status][Web Board]

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1608

题目大意:

  题目给出N个数,问这些数两两相加共会出现几次加法进位。

题目思路:

  【二分】

  N最大5000,其实这题直接拿高精度加法统计就能过,而且0ms,数据不算很强。

  NlogN的做法N可以达到10W。

  首先可以假设这N个数位数都相同(不足补0)

  枚举每一位(k=1~8),对于当前的这一位,将N个数按照当前这一位上数字从小到大排序。

  再枚举每个数,假设第i个数在第k位为x,则二分其余N-1个数这一位>=10-x的个数,加到答案上。

  (针对每一位去统计进位次数)

  这样时间复杂度降到NlogN。

  

 1 /****************************************************
 2
 3     Author : Coolxxx
 4     Copyright 2017 by Coolxxx. All rights reserved.
 5     BLOG : http://blog.csdn.net/u010568270
 6
 7 ****************************************************/
 8 #include<bits/stdc++.h>
 9 #pragma comment(linker,"/STACK:1024000000,1024000000")
10 #define abs(a) ((a)>0?(a):(-(a)))
11 #define lowbit(a) (a&(-a))
12 #define sqr(a) ((a)*(a))
13 #define mem(a,b) memset(a,b,sizeof(a))
14 const double EPS=1e-8;
15 const int J=10;
16 const int MOD=100000007;
17 const int MAX=0x7f7f7f7f;
18 const double PI=3.14159265358979323;
19 const int N=5004;
20 const int M=14;
21 using namespace std;
22 typedef long long LL;
23 double anss;
24 LL aans;
25 int cas,cass;
26 int n,m,lll,ans;
27 int e[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
28 int a[N],b[N];
29 int main()
30 {
31     #ifndef ONLINE_JUDGE
32     freopen("1.txt","r",stdin);
33 //  freopen("2.txt","w",stdout);
34     #endif
35     int i,j,k;
36     int x,y,z;
37 //  for(scanf("%d",&cass);cass;cass--)
38 //  for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
39 //  while(~scanf("%s",s))
40     while(~scanf("%d",&n))
41     {
42         for(i=1;i<=n;i++)
43             scanf("%d",&a[i]);
44         for(k=1;k<10;k++)
45         {
46             for(i=1;i<=n;i++)
47                 b[i]=a[i]%e[k];
48             sort(b+1,b+1+n);
49             for(i=1;i<=n;i++)
50             {
51                 int l,r,mid;
52                 l=i+1,r=n;
53                 while(l<=r)
54                 {
55                     mid=(l+r+1)/2;
56                     if(b[mid]+b[i]<e[k])l=mid+1;
57                     else r=mid-1;
58                 }
59                 aans+=n-r;
60             }
61         }
62         printf("%lld\n",aans);
63     }
64     return 0;
65 }
66 /*
67 //
68
69 //
70 */

时间: 2024-10-03 22:49:42

XMU 1608 nc与加法进位 【二分】的相关文章

fpga加法进位链实现过程中的一个特点

altera fpga 用quartus综合后会出现加法进位链一正一反的情况,所谓一正一反指的是假设某一级输入为a,b,进位值为c,则该级进位链逻辑应该为cout=ab+ac+bc,但实际为 cout=b'c'+a'c'+a'b'之后一级的进位链为cout=ab+ac'+bc'.那么假设前后两级都有进位,那么第一级的进位输出cout就是0,第二级的进位输出就是1,将进位链扩展并且所有进位链都有进位,那么就会出现进位链输出为0,1,0,1,0,1,0,1,这样无限循环下去,如果所有进位链都无进位,

XMU 1606 nc与滴水问题 【模拟】

1606: nc与滴水问题 Time Limit: 1000 MS  Memory Limit: 64 MBSubmit: 85  Solved: 27[Submit][Status][Web Board] Description nc最近很无聊~所以他总是想各种有趣的问题来打发时间.nc的宿舍水龙头在漏水,他只好拿一个水桶去接水,他很好奇至少过多久这个水桶会装满水.已知水桶是圆柱体,底面直径为D,高为H:又知道水龙头每K秒会滴下一滴水滴,我们假设水滴为球体,其半径为R.由于nc很懒,你需要帮他

XMU 1607 nc与点对距离 【线段树】

1607: nc与点对距离 Time Limit: 5000 MS  Memory Limit: 512 MBSubmit: 60  Solved: 8[Submit][Status][Web Board] Description nc最近很无聊~所以他总是想各种有趣的问题来打发时间.nc在地上画了一条一维坐标轴,坐标轴上有n个点.第一个点的坐标为 x1,第二个点坐标为 x2,....第n个点的坐标为 xn.他想对这些点进行如下两种操作:(1)给定两个值p和d,将第p个点的坐标移动到 xp+d.

51nod基础题感触(1005大数加法)

这篇就作为算法学习这块的第一篇文章啦!之前一直想来写一下博客来着,但是自己太懒了,建模比赛后想多休息(玩)一会儿(很长时间),一直没写.最近总算是下定决定了! “的确是要开始写一写最近自己做题的感受了!”(超认真的!) 直入正题!(由于才正式开始学习,理解有不足之处还请指正!) 首先,遇到这样的题,如果不限制语言的话,抱着能快则快的心态,我们就用强大的Python就行了.实现起来也是十分地的简单,在这里,我就直接上代码啦!(这里我用的是Python3.6) a=input()#输入,这时候的a实

汇编指令缩写

1 常见汇编命令英文缩写 2 3 寄存器类(register): 4 通用寄存器: EAX.EBX.ECX.EDX:是ax,bx,cx,dx的延伸,各为32位 5 AH&AL=AX(accumulator) :累加寄存器 6 BH&BL=BX(base) :基址寄存器 7 CH&CL=CX(count) :计数寄存器 8 DH&DL=DX(data) :数据寄存器 9 特殊功能寄存器: ESP.EBP.ESI.EDI.EIP:為sp,bp,si,di,ip的延伸,32位元

【AtCoder】ARC092 D - Two Sequences

[题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n).n<=200000. [算法]二分+模拟 [题解]将答案分成(A[i]+B[j]-A[i]^B[j])的异或和 以及 A[i]^B[j]的异或和,即单独考虑进位(后面部分很好算). 二进制题目必须拆位,通过进位使第k位+1的数对必须满足 ( A[i] & ((1<<k)-1) ) + ( B[i] & ((1<<k)-1) ) >= (1<<

hdu1041

#include <iostream> #include <string> using namespace std; const int SIZE = 1001; const int BASE = 10; string result[SIZE]; string two("2"); void initial() { int mcarry, temp, carry; int k; string tempResult; result[1] = "0"

汇编语言第二课作业-实验1

Debug命令-摘自百度百科 A 汇编命令 功能: 将指令直接汇编成机器码输入到内存中. 说明: 用于小段程序的汇编及修改目标程序,所有输入的数字均采用十六进制, 用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,该语句被汇编到 CS:0100区域. 例A:>DEBUG -a 0100 08F1:0100 MOV AH,09 08F1:0102 MOV DX,109 08F1:0105 INT 21H; 08F1:0107 INT 21H; <-XP下运行cmd d

高精度计算

一.高精度计算中需处理好以下问题 •数据的接收与存储: •计算结果位数的确定: •进位.借位.商和余数的处理 •运算结果的输出 1.数据的接收方法和存贮方法 数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中. Type numtype=array[1..500]of word:{整数数组类型} Var a,b:numtype: {a和b为整数数组} la,lb:integer: {整数数组a的长度和b的长度}