A. Greed
模拟
ac:
#include<bits/stdc++.h>
#define MAXN 100005
#define ll long long
using namespace std;
int a[MAXN]={0};
int main()
{
int n,x;
ll sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
sum+=x;
}
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
if(a[n-1]+a[n-2]>=sum)
printf("YES\n");
else printf("NO\n");
return 0;
}
B. Wrath
简单模拟
ac:
#include<bits/stdc++.h>
#define MAXN 1000005
#define ll long long
using namespace std;
int a[MAXN]={0};
int vis[MAXN]={0};
int main()
{
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int maxi=0;//记录后面的刀到这个位置的最大剩余长度
for(int i=n;i>=1;i--)
{
if(maxi>0)
vis[i]=1;
maxi--;
if(a[i]>maxi)
maxi=a[i];
}
for(int i=1;i<=n;i++)
if(vis[i]==0)
sum++;
printf("%d\n",sum);
return 0;
}
C. Pride
题意:
一个数组,数组中可以相邻两个的求gcd,然后赋给任意一个,
求最快把数组中所以都变成1的步数
如果变不出,输出-1
解析:
如果所有的数的最大公约数gcd(a1,a2,a3,a4,......)不是1,呢么不论怎么变换,都只能变换成总gcd,出现无解
如果a1~an中存在一个1,呢么ans=n-sum(1)
gcd(a1,a2,a3,a4,....)=先求a1和a2gcd,赋给a2,再求a2和a3的gcd,赋给a3,类推
gcd(a,b,c,d)=gcd(gcd(gcd(a,b),c),d)
我们需要找出最小长度的区间 l~r, gcd(a[l],..,a[r])=1 暴力模拟
ac:
#include<bits/stdc++.h>
#define MAXN 2005
#define ll long long
using namespace std;//先变一个1出来
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int a[MAXN]={0};
int main()
{
int n,ans=999999,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]!=1)
sum++;
}
if(sum!=n)
{
printf("%d\n",sum);
}
else{
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
a[i]=gcd(a[i],a[j]);
if(a[i]==1)
ans=min(ans,j-i);
}
if(ans>=2000)
printf("-1\n");
else printf("%d\n",ans+n-1);
}
return 0;
}