第五届上海市青少年算法竞赛 T2 数对排序(数学、思维)

第二题:T2数对排序

标签:数学、思维
题意:由两个自然数组成的一对数称之为有序数对,有序是指数对的第一项与第二项是区别的,例如 ( 0 , 1 ) (0,1) (0,1) ( 1 , 0 ) (1,0) (1,0)是不一样的数对。对所有有序数对进行排序,先按照每对中两数之和从小到大排序,两数之和相同,再按照每个数对中第一个数从小到大排序。
例如前 6 6 6个数对为 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 0 , 2 ) , ( 1 , 1 ) , ( 2 , 0 ) (0,0), (0,1), (1,0), (0,2), (1,1), (2,0) (0,0),(0,1),(1,0),(0,2),(1,1),(2,0)
给定一个整数 k k k,求出第 k k k个数对。 ( 1 ≤ k ≤ 1 , 000 , 000 , 000 ) (1≤k≤1,000,000,000) (1k1,000,000,000)
题解:我们列一下前几个,找下规律:
( 0 , 0 ) (0,0) (0,0) ( 0 , 1 ) , ( 1 , 0 ) (0,1), (1,0) (0,1),(1,0) ( 0 , 2 ) , ( 1 , 1 ) , ( 2 , 0 ) (0,2), (1,1), (2,0) (0,2),(1,1),(2,0) ( 0 , 3 ) , ( 1 , 2 ) , ( 2 , 1 ) , ( 3 , 0 ) (0,3), (1,2), (2,1),(3,0) (0,3),(1,2),(2,1),(3,0) ( 0 , 4 ) , ( 1 , 3 ) , ( 2 , 2 ) , ( 3 , 1 ) , ( 4 , 0 ) (0,4), (1,3), (2,2),(3,1),(4,0) (0,4),(1,3),(2,2),(3,1),(4,0)
能够发现数对之和为 0 0 0的有 1 1 1个;数对之和为 1 1 1的有 2 2 2个;数对之和为 2 2 2的有 3 3 3个;数对之和为 3 3 3的有 4 4 4个…
我们可以用 ( 1 + n ) ∗ n 2 \frac {(1+n)*n}{2} 2(1+n)n公式,确定要找的第 k k k个数对两项之和为多少,因为第 1 1 1个数对是从 ( 0 , 0 ) (0,0) (0,0)开始的,所以找到的时候要 n − 1 n-1 n1,最后输出的时候,要注意对于每个之和为 n n n的第一项数也是从 0 0 0开始的,所以 k k k也需要减 1 1 1
代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int k, n = 0;
    cin >> k;
    while ((1 + n) * n / 2 < k) n++;
    n--;
    k -= (1 + n) * n / 2;
    k--;
    cout << k << " " << n - k << endl;
    return 0;
}

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值