比赛链接:牛客小白月赛63_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ
A题
签到题,把所有数按位与一遍就行。
#include<iostream>
using namespace std;
int main()
{
int n,a,ans;
cin>>n;
cin>>a;
ans=a;
for(int i=2;i<=n;++i)
{
cin>>a;
ans=a&ans;
}
cout<<ans<<endl;
return 0;
}
B题:
阅读理解题,暴力,遍历每次攻击,判断是否击杀随从,击杀则attack++,在每次循环最后计算boss伤害的增量。
#include<iostream>
using namespace std;
int main()
{
int n,m;
int attack=2;
int a[1005];
int ans=0;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
{
if(attack==a[j])
{
attack++;
a[j]=-1;
}
else
{
a[j]-=attack;
}
}
ans+=attack;
}
cout<<ans<<endl;
return 0;
}
c题
核心在于如何求n个数的全排列,这里我用了一个dfs,x为当前处理的位数,i为该位放置的数字。当x==n时,根据双方对应的大爹个数,计算是谁赢了还是平局,给对应计数器加1.
#include<iostream>
using namespace std;
typedef long long ll;
int n;
int a[15],b[15];
ll victory=0,equ=0,defeat=0;
bool vis[15]={false};
ll va=0,vb=0;
void dfs(int x)
{
for(int i=1;i<=n;++i)
{
if(vis[i]==false)
{
vis[i]=true;
if(a[x]>b[i]) va++;
else if(a[x]<b[i]) vb++;
if(x==n)
{
if(va>vb) victory++;
else if(va<vb) defeat++;
else if(va==vb) equ++;
}
else dfs(x+1);
vis[i]=false;
if(a[x]>b[i]) va--;
else if(a[x]<b[i]) vb--;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
dfs(1);
cout<<victory<<" "<<defeat<<" "<<equ<<endl;
return 0;
}
D题
我觉得这个题的难度配不上D这个编号,贪心,每次选最便宜那个颜色,到第三个时,换第二便宜的颜色,然后继续用最便宜的。最后,首尾相接,所以最后那朵花用第二便宜颜色染,防止与最开始两朵花颜色连续。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll n,m;
ll a[5];
ll ans=0;
int two=0;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a[i];
}
sort(a+1,a+m+1);
for(int i=1;i<n;++i)
{
if(two!=2)
{
ans+=a[1];
two++;
}
else
{
ans+=a[2];
two=0;
}
}
ans+=a[2];
if(m==1&&n>=3) cout<<"Ginger666"<<endl;
else cout<<ans<<endl;
return 0;
}