https://ac.nowcoder.com/acm/contest/82758#question
A
贪心考虑 我们可以通过任意次操作构造目前满足条件的值 通过排序满足最大值,拆位即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+10;
int getBit(int a, int b) { return (a >> b) & 1; }
int p[N],b[40];
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i];
for(int j=0;j<=31;j++)
{
bool st1=0,st2=0;
for(int i=1;i<=n;i++)
{
if(getBit(p[i],j)==0)
st1=1;
if(getBit(p[i],j)==1)
st2=1;
}
if(st1&&st2)
b[j]=1;
}
int sum=0;
for(int i=0;i<=31;i++)
sum+=b[i]*pow(2,i);
cout<<n*sum;
}
B
# include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
map<double,int>ma;
int n,s1=0,s=0;
cin>>n;
for(int i=1;i<=n;i++)
{
double x,y;
cin>>x>>y;
if(x==0)
{
s1++;
if(y==0)
s++;
}
else
ma[y/x]++;
}
int mx=0;
for(auto [x,y]:ma)
{
mx=max(mx,y);
}
cout<<max(mx+s,s1);
}
D
# include <bits/stdc++.h>
using namespace std;
const int N=3e5+100;
int a[N],b[N];
bool st[N];
int main()
{
int lena,lenb;cin>>lena>>lenb;
for(int i=1;i<=lena;i++)cin>>a[i];
for(int j=1;j<=lenb;j++)cin>>b[j];
sort(a+1,a+1+lena);
sort(b+1,b+1+lenb);
int res=0;
int t=1;
for(int i=1;i<=lena;i++)
{
int flag=0;
for(int j=t;j<=lenb;j++)
{
if(b[j]>=a[i])
{
flag=1;
res+=b[j];t=j+1;break;
}
}
if(flag==1)continue;
}
cout<<res;
}
J
# include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
double x,y;
}s[10];
signed main()
{
for(int i=1;i<=4;i++)
{
cin>>s[i].x>>s[i].y;
}
s[5]=s[1];
double sum=0;
for(int i=1;i<=4;i++)
{
sum+=sqrt((s[i+1].x-s[i].x)*(s[i+1].x-s[i].x)+(s[i+1].y-s[i].y)*(s[i+1].y-s[i].y));
}
cout<<fixed<<setprecision(10)<<sum;
}
E 贪心考虑的想,对于每个背包独有的糖果我们都取,如果超过了n/2,那么就取n/2个。然后对于两个背包共有的糖果,我们将其全取出来并去重,然后对于这些共有的糖果我们就放到个数小于n/2的背包中。
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
//const ll P=2281701377;
const ll P=998244353;
set<int> s,ss,same;
void solve(){
s.clear();
ss.clear();
same.clear();
int n,x,y;
cin>>n>>x>>y;
while(x--){
int a,b;cin>>a>>b;
s.insert(a);
}
while(y--){
int a,b;cin>>a>>b;
ss.insert(a);
if(s.find(a)!=s.end()){
same.insert(a);
}
}
int ls=s.size(),lsa=same.size(),lss=ss.size();
cout<<min(min(ls-lsa,n/2)+min(lss-lsa,n/2)+lsa,n)<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}
H
由 Mex 的性质,我们可以对数组a中任意相邻元素进行分类讨论。为方便,我们用x,y表示:a[i],a[i-1];
if(x[HTML_REMOVED]y)则代表出现i位出现确定的值
if(x==y)p[i]可以选择[x+1,n−1] 之间的数,i位之前已选择n-i个数,且x为其中一个数,所以还剩余(n-1-x-1+1)-(n-i-1)=i-x个数可选
res乘i-x既可
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int N=3e5+100;
#define int long long
int a[N];
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int res=1;
for(int i=1;i<=n;i++)
{
int x=a[i];
if(i==n&&x!=n)
{
cout<<0<<endl;
return ;
}
if(x<a[i-1])
{
cout<<0<<endl;
return ;
}
if(a[i]-1>i)
{
cout<<0<<endl;
return ;
}
else if(x==a[i-1])
{
res*=i-x;
res%=mod;
}
}
cout<<res<<endl;
}
signed main()
{
int T;cin>>T;
while(T--)
{
solve();
}
}