第一题:最小间隔
Description
给你 n(2≤n≤10^5) 个数,两两不同。
请你找出两个数,其间距最小,如果有多对数字,按升序依次输出即可。
Format
Input
第一行一个正整数 n,
第二行连续 n 个整数,绝对值不超过 10^7。
Output
输出间距最小的数对,用一个空格隔开;如果有多对,每行一对。
Samples
输入数据 1
4
8 6 5 7
输出数据 1
5 6
6 7
7 8
Limitation
1s, 1024KiB for each test case.
思路:这一题没啥好说的,直接排序完跑一遍循环找最短纪录就行了
代码(含注释):
#include<bits/stdc++.h>
using namespace std;
int n,a[100007],minn=10000000;
int main ()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n); //排序 保证两个数字的距离最小
for(int i=2;i<=n;i++){
int tmp=a[i]-a[i-1]; //收集两个数字的距离
minn=min(minn,tmp); //循环结束后minn就是整个数组里最小的距离
}
for(int i=2;i<=n;i++){ //考虑到会有多个答案 寻找每一个距离为minn的两个数
if(a[i]-a[i-1]==minn){
cout<<a[i-1]<<" "<<a[i]<<endl; //若符合条件就输出
}
}
return 0;
}
第二题:丢了番的图
Description
听说丢番图研究不定方程,隔壁老王也开始做起来数学研究。
老王感兴趣的问题是:
给你 n 个变量 x1,x2,…,xn以及一个正整数 k,请你求出满足
x1+x2+x3+⋯+xn≤k
的自然数的解有多少组?
Format
Input
两个正整数 n(1≤n≤10)和 k(1≤k≤10),代表自然数变量的个数。
Output
一个正整数,表示解的组数。
Samples
输入数据 1
1 3
输出数据 1
4
Hint
分别有 0,1,2,3共 4 组解。
输入数据 2
2 4
输出数据 2
15
Hint
分别有 (0,0), (0,1), (1,0), (0,2), (1,1), (2,0), (0,3), (1,2), (2,1), (3,0), (0,4), (1,3), (2,2), (3,1), (4,0) 共 1515 组解。
Limitation
1s, 1024KiB for each test case.
思路:这个第一眼看到的时候觉得应该是要用什么数学思路来解题,但本人的数学不是很好(小声)于是后面又想了想发现这题的规模不大,可以直接用dfs/递归做。只要用递归代替n层循环就可以枚举出每一个结果。
代码(含注释):
#include<iostream>
using namespace std;
int N,K,sum;
void dfs(int n,int k){ //dfs(n,k)代表当前已用掉n个位置与k个空间
if(k>K){ //如果超过了K,就是不满足题目规定的条件,直接return
return ;
}
if(n==N){ //如果没超过K而且达到了N个变量,则正解+1,然后return
sum++;
return ;
}
for(int i=0;i<=K;i++){ //反正最多也只用遍历10*10次,数据够那就暴力枚举(这里最多相当于写十层1-10的循环)
dfs(n+1,k+i);
}
}
int main ()
{
cin>>N>>K; //和n k区分开这样函数里方便用
dfs(0,0);
cout<<sum;
return 0;
}