牛客小白月赛63_A-D
A-子序列的权值最小值
求数组所有非空子序列权值的最小值
可以自己推一下,越按位与运算,数字越小(或相等),将给定数组中所有数字按位与运算即可得到最小。
- 按位与所有数字
完整代码:
int a[100];
void solve(){
int n,ans;
cin >>n;
for(int i=1;i<=n;i++){
int x;
cin >>x;
if(i==1) ans=x;
else ans&=x;
}
cout <<ans<<endl;
}
B-魔导师晨拥
题意:
有
n
个随从,现进行m
次攻击,初始攻击力为2,每次攻击从左至右攻击随从,若恰好击杀随从,则攻击力+1,攻击完随从后再攻击英雄。要求输出:英雄受到多少点攻击。
- 模拟题,直接写
int a[1000];
void solve(){
int n,m;
cin >>n>>m;
int ans = 0;
int atc = 2;
for(int i=1;i<=n;i++){
cin >>a[i];
}
while(m--){
for(int i=1;i<=n;i++){
if(a[i]>0){
a[i]-=atc;
if(a[i]==0) atc++;
}
}
ans+=atc;
}
cout <<ans<<endl;
}
C-GCPC总决赛
题意:两个学校有n支队伍,每个队伍两两配对进行比赛,比赛规则为:"大跌"多的队伍获胜
要求输出:所有情况中,小D学校的获胜、失败、平局的情况。
- 全排列(选队伍),然后for循环判断队伍输赢数量,再判断学校输赢情况。
int a[1000];
int b[1000];
int ans_1=0,ans_2=0,ans_3=0;
void swap(int x,int y){
int t;
t=a[x];
a[x]=a[y];
a[y]=t;
}
void perm(int p,int q){
if(p==q){
int w=0,l=0;
for(int i=1;i<=q;i++){
if(a[i]>b[i]){
w++;
}else if(a[i]<b[i]){
l++;
}
}
if(w>l) ans_1++;
else if(w<l) ans_2++;
else ans_3++;
}else{
for(int i=p;i<=q;i++){
swap(p,i);
perm(p+1,q);
swap(p,i);
}
}
}
void solve(){
cin >>n;
for(int i=1;i<=n;i++){
cin >>a[i];
}
for(int i=1;i<=n;i++){
cin >>b[i];
}
perm(1,n);//1-n全排列
cout <<ans_1<<" "<<ans_2<<" "<<ans_3;
}
D-Ginger的大花环
题意:
n
朵花的花环,k
个颜色,要求连续三朵不能是相同颜色要求输出:最小涂色花费
- 只有一种颜色时不能涂色
- 能涂色的情况下,每3朵花凑成
"1 1 2"
(1代表最小花费,2代表第二小花费),假设凑了x (x=(int)n/3
)个"1 1 2"
- 若n刚好是3的倍数,直接输出x个
"1 1 2"
的花费 - 若n是3的倍数多一朵,则输出x个
"1 1 2"
的花费+2
的花费 - 若n是3的倍数多两朵,则输出x个
"1 1 2"
的花费+1
的花费+2
的花费
long long a[100005];//存入花费
int main(){
long long n,k;
cin >>n>>k;
for(int i=1;i<=k;i++){
cin >>a[i];
}
if(k==1){
cout <<"Ginger666";
return 0;
}
sort(a+1,a+1+k);//从小到大排序,使得a[1]为最小花费,a[2]为第二小花费
if(n%3==0){
cout <<n/3*a[1]*2+n/3*a[2];
}
if(n%3==1){
cout <<n/3*a[1]*2+n/3*a[2]+a[2];
}
if(n%3==2){
cout <<n/3*a[1]*2+n/3*a[2]+a[1]+a[2];
}
return 0;
}