https://codeforces.com/contest/1763/problem/A
题意:给你若干个数,你可以交换两个数的二进制的第k位任意次,求最大值与最小值的差最大值是多少。
思路:最大值:或操作,有1为1;最小值:与操作,有0为0;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[200005];
signed main()
{
int tt;
for(cin>>tt;tt--;)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>b[i];
int x=b[0],y=b[0];
for(int i=1;i<n;i++)
{
x|=b[i];
y&=b[i];
}
cout<<x-y<<'\n';
}
}
https://codeforces.com/contest/1763/problem/B
题意:n个敌兵,每个敌兵有h血和p攻击力。你有k血,每攻击敌方一次,你会受到存活下来的敌兵中攻击最弱的一击,会减少血量。问你能不能把所有敌方打败。
思路:对攻击力从小到大排序。利用双指针,看在有血状态下能不能把所有敌方打败。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[200005];
pair<int,int>p[200005];
#define ft first
#define sd second
bool vis[200005];
bool cmp(pair<int,int> x,pair<int,int> y)
{
if(x.sd==y.sd)return x.ft<y.ft;
return x.sd<y.sd;
}
signed main()
{
int tt;
for(cin>>tt;tt--;)
{
for(int i=0;i<200005;i++)vis[i]=0;
int n,m;
cin>>n>>m;
int mx=0;
for(int i=0;i<n;i++)
{
cin>>p[i].ft;
if(mx<p[i].ft)mx=p[i].ft;
}
for(int i=0;i<n;i++)
{
cin>>p[i].sd;
}
sort(p,p+n,cmp);
int res=0;
for(int i=0;i<n;i++)
{
int j=i;
while(j<n&&p[j].ft<=(m+res))j++;
if(j==n){puts("YES");goto out;}
int x=p[j].ft;
int y=p[j].sd;
while(x>(res+m))
{
res+=m;
m-=y;
if(m<0)
{
puts("NO");goto out;
}
}
i=j;
}
puts("YES");
out:continue;
}
}
https://codeforces.com/contest/1763/problem/C
#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[200005];
pair<int,int>p[200005];
#define ft first
#define sd second
signed main()
{
int tt;
for(cin>>tt;tt--;)
{
int n;
cin>>n;
int mx=0;
for(int i=0;i<n;i++)
{
cin>>b[i];
mx=max(mx,b[i]);
}
if(n>=4){cout<<n*mx<<'\n';continue;}
if(n==1){cout<<n*mx<<'\n';continue;}
if(n==2)
{
int ans=b[0]+b[1];
ans=max(ans,2*abs(b[0]-b[1]));
cout<<ans<<'\n';continue;
}
if(n==3)
{
int ans=b[0]+b[1]+b[2];
ans=max(ans,3*b[0]);
ans=max(ans,3*b[2]);
ans=max(ans,3*(abs(b[1]-b[0])));
ans=max(ans,3*(abs(b[2]-b[0])));
ans=max(ans,3*(abs(b[1]-b[2])));
cout<<ans<<'\n';
}
}
}