1.叠砖块
简单暴力即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
sum+=i;
cout<<sum;
return 0;
}
2.区间分组
贪心对左端点进行排序,然后遍历分组即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
struct line
{
int l,r;
bool operator<(const line &p) const
{
if(l!=p.l)
return l<p.l;
return r<p.r;
}
} p[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
}
sort(p,p+n);
int u=p[0].r,g=-1;
for(int i=1;i<n;i++)
{
if(p[i].l<=min(u,g))
{
cout<<"NO";
return 0;
}
if(p[i].l<=u)
g=p[i].r;
else if(p[i].l<=g)
u=p[i].r;
else
u=p[i].r;
}
cout<<"YES";
return 0;
}
3.改变数值
我们先来了解一下裴蜀定理
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
裴蜀定理推广到n个数也成立。
所以我们解决这道题的的基本思想就是,找到其中一些数,使其gcd等于1,然后找最小值可以用01背包来解决
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=310;
int a[N],b[N];
map<int,int> f;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
f[0]=0;
for(int i=0;i<n;i++)
{
for(auto [k,v] : f)
{
int d=__gcd(k,a[i]);
if(f.count(d))
f[d]=min(f[d],v+b[i]);
else
f[d]=v+b[i];
}
}
if(f.count(1))
cout<<f[1];
else
cout<<-1;
return 0;
}