题意为给定两个数,如果a>b,就让a=a-b,不然就让b=b-a;因为a,b之前的差距可能很大,假如b比a大很大,那么我们一遍一遍的让b=b-a肯定会超时,一般减法会超时的话,我们就需要去想是否可以用除法进行优化,由此,我们可以算出让b变到比a小需要经过多少次,然后直接让b等于相应的值即可。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
typedef pair<int,int> pll;
int mod=10000+7;
void solve()
{
ll a,b;
cin>>a>>b;
ll cnt=0;
while(a!=b){
if(a>b) swap(a,b);
ll x=(b-a+a-1)/a;
b=b-a*x;
cnt+=x;
}
cout<<cnt<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
t=1;
//cin>>t;
while(t--){
solve();
}
system("pause");
return 0;
}
题意:给定长度为n的数组,让数组中每个数自由组合相加,问第k个小的数的值。
思路:(看别人的题解)我们用set进行维护,每次让set中的第一个元素加上数组中的所有值,然后再插入set,然后删掉该数,循环k次后的容器中的首位元素即为所求。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef pair<int,int> pll;
typedef long long ll;
void solve()
{
int n,k;
cin>>n>>k;
vector<ll> a(n);
for(int i=0;i<n;i++){
cin>>a[i];
}
set<ll> z;
for(int i=0;i<k;i++){
ll res=*z.begin();
z.erase(res);
for(int j=0;j<n;j++){
z.insert(a[j]+res);
}
}
cout<<*z.begin()<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
while(t--){
solve();
}
system("pause");
return 0;
}