18727 数对问题一

18727 数对问题一

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: 不限定
Description
一个长度为N的正整数序列,现在需要计算出有多少对数字的差的绝对值为C。
注意只要位置不同就认为是不相同的数对。

输入格式
第一行,两个整数 N, C。(1=<N<=10000),(1=<C<=10000)
第二行,N个正整数a1…an。 (1=<ai<=10000)

输出格式
仅一行,满足条件的数对的个数。

输入样例
4 1
1 2 3 1

输出样例
3

提示
(a1,a2),(a2,a3),(a2,a4)共3个数对满足条件。

分析:

本题可以用暴力的方法,直接双层循环做也不会超时,但有更快的方法,我们可以观察到,本题数据范围都较小,都在一万以内,所以可以用一个标记数组,每输入一个数据,则使该标记数组距离其±c的元素自增,最后把下标为数据的标记数组元素加起来再除以二即可。为什么要除二?因为在这个机制下,会使数据重复出现。
如:输入格式是
第一行 2 1
第二行 5 6
当输入5的时候,4和6都会被标记自增,设标记数组为a[n] 则a[4]++,a[6]++,但当输入6的时候a[5]++;因此符合条件的数对会记录两次。

代码

#include <iostream>
#include <cstring>
using namespace std;
int num[100010],a[200010];
int main(void)
{
	memset(num,0,sizeof(num));
	memset(a,0,sizeof(a));
	int n,c,sum=0;
	cin>>n>>c;
	int i;
	for(i=1;i<=n;i++)
	{
		cin>>num[i];
		a[num[i]+c]++;
		if(num[i]-c>=0)
		a[num[i]-c]++;
	} 
	for(i=1;i<=n;i++)
	{
		sum+=a[num[i]];
	}
	cout<<sum/2;
	return 0;
} 
请使用c++解决以下问题: ## 题目描述 $N$ 名学生参加了场考试,考试包含学和信息学两个部分。第 $i$ 名学生($1 \le i \le N$)在学部分得了 $S_i$ 分,在信息学部分得了 $T_i$ 分。T 教授和 I 教授将根据分决定每名学生是否通过考试。 - T 教授认为两门科目都重要;他希望学得分至少为 $A$ 分且信息学得分至少为 $B$ 分的学生才能通过。 - I 教授只关心总分;他希望总分至少为 $C$ 分的学生才能通过。 - 只有两位教授都希望其通过的学生才能通过考试。 你不知道这些标准的具体值:即 $A$、$B$ 和 $C$ 的值。相反,给定 $Q$ 组整三元组 $(X_j, Y_j, Z_j)$($1 \le j \le Q$),你希望知道当 $A = X_j$、$B = Y_j$、$C = Z_j$ 时,通过考试的学生人。 编写个程序,输入学生人、每名学生的分以及些标准,计算在每组标准下通过考试的学生人。 ## 输入格式 从标准输入读取以下据。输入中的所有值均为整。 $N\ Q$ $S_1\ T_1$ $\vdots$ $S_N\ T_N$ $X_1\ Y_1\ Z_1$ $\vdots$ $X_Q\ Y_Q\ Z_Q$ ## 输出格式 向标准输出写入 $Q$ 行。第 $j$ 行($1 \le j \le Q$)应包含当 $A = X_j$、$B = Y_j$、$C = Z_j$ 时通过考试的学生人。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 4 35 100 70 70 45 15 80 40 20 95 20 50 120 10 10 100 60 60 80 0 100 100 ``` ### 输出 #1 ``` 2 4 1 1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 10 10 41304 98327 91921 28251 85635 59191 30361 72671 28949 96958 99041 37826 10245 2726 19387 20282 60366 87723 95388 49726 52302 69501 66009 43754 45346 3158 25224 58881 18727 7298 24412 63782 24107 10583 61508 65025 29140 7278 36104 56758 2775 23126 67608 122051 56910 17272 62933 39675 15874 117117 ``` ### 输出 #2 ``` 1 3 5 8 8 3 3 3 5 6 ``` ## 说明/提示 ### 样例 1 解释 - 当 $A = 20$、$B = 50$ 且 $C = 120$ 时,只有第 1 名和第 2 名学生能在学中至少得 20 分,在信息学中至少得 50 分,且总分至少为 120 分。因此,通过考试的学生人为 2。 - 当 $A = 10$、$B = 10$ 且 $C = 100$ 时,只有第 1 名、第 2 名、第 4 名和第 5 名学生能在学中至少得 10 分,在信息学中至少得 10 分,且总分至少为 100 分。因此,通过考试的学生人为 4。 - 当 $A = 60$、$B = 60$ 且 $C = 80$ 时,只有第 2 名学生能在学中至少得 60 分,在信息学中至少得 60 分,且总分至少为 80 分。因此,通过考试的学生人为 1。 - 当 $A = 0$、$B = 100$ 且 $C = 100$ 时,只有第 1 名学生能在学中至少得 0 分,在信息学中至少得 100 分,且总分至少为 100 分。因此,通过考试的学生人为 1。 ### 据范围 - $1 \le N \le 100\,000$。 - $1 \le Q \le 100\,000$。 - $0 \le S_i \le 1\,000\,000\,000$($1 \le i \le N$)。 - $0 \le T_i \le 1\,000\,000\,000$($1 \le i \le N$)。 - $0 \le X_j \le 1\,000\,000\,000$($1 \le j \le Q$)。 - $0 \le Y_j \le 1\,000\,000\,000$($1 \le j \le Q$)。 - $0 \le Z_j \le 2\,000\,000\,000$($1 \le j \le Q$)。 ### 子任务 1. (2 分)$N \le 3\,000$,$Q \le 3\,000$。 2. (20 分)$S_i \le 100\,000$,$T_i \le 100\,000$($1 \le i \le N$),$X_j \le 100\,000$,$Y_j \le 100\,000$,$Z_j = 0$($1 \le j \le Q$)。 3. (21 分)$S_i \le 100\,000$,$T_i \le 100\,000$($1 \le i \le N$),$X_j \le 100\,000$,$Y_j \le 100\,000$,$Z_j \le 200\,000$($1 \le j \le Q$)。 4. (57 分)无额外约束。
最新发布
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值