4786. 闯关 - 贪心
思路:
- 因为总比分>特殊关卡时,才能修改关卡值,所以前期要拿普通关卡攒攒分,特殊关卡放在最后
- 而特殊关卡要按比分从大到小开始闯,这样分数滚雪球 滚到后面分更大
- 注意分数res要long long
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int m,n,sum=0,num=0,cnt=0;
cin>>m>>n;
int a[m+1],b[n+1];
int nn=n;
for(int i=1;i<=m;i++) cin>>a[i],sum+=a[i];
while(nn--)
{
int t;
cin>>t;
num+=a[t];
b[cnt++]=a[t];
}
long long x=sum-num;
sort(b,b+n,cmp);
for(int i=0;i<n;i++)
{
if(x!=0&&x>b[i]) x*=2;
else x+=b[i];
}
cout<<x;
}
4787. 构造序列
思路:
- 长度为n的序列,一共有n/2个位置可以放置gcd(x,y)中的x y
- 因为是构造题 所以我们可以让第一个位置凑出一个较大值k 后面(n/2-1)个位置全部凑成1
- 所以k=m-(n/2-1)×1
- 第一个位置的x和y就是 x=k y=k×2
- 所以第一个位置的值gcd(k,k×2)=k
- 后面从1e9倒着放 就能凑出(n/2-1)个1 最终序列值就为m
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(n==1&&m==0)
{
cout<<1;
return 0;
}
if(n/2>m||n==1)
{
cout<<-1;
return 0;
}
int x=m-(n/2-1),y=x*2;
cout<<x<<" "<<y<<" ";
n-=2;
for(int i=1e9;n>0;i--)
{
cout<<i<<" ";
n--;
}
}