牛客周赛65

https://ac.nowcoder.com/acm/contest/92972)(比赛链接)

目录

A.超市

B.雨幕

C.闺蜜

D.医生

E.F.降温

G.乌鸦


A.超市

1.思路

        只买两个水果中更便宜的那一种水果就可以了

2.代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main(){
    int n,a,b;
    cin>>n>>a>>b;
    int min1 = min(a,b);
    cout<<n/min1<<endl;
    return 0;
}

B.雨幕

1.思路

        for循环对于每个点进行2*2区域判断即可

2.代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e3+7;
char a[N][N];

signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    int count=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m-1;j++){
            if(a[i][j]=='*'&&a[i+1][j]=='*'&&a[i][j+1]=='*'&&a[i+1][j+1]=='*'){
                count++;
            }
        }
    }
    cout<<count<<endl;
    return 0;
}

C.闺蜜

1.思路

        因为小紫可以置换一次手牌,所以,小紫一定会选择将自己最小的手牌跟小红最大的手牌置换。对于数组所有数据,从小到大排序,小紫获得的手牌为a1、a3、...、an-1,而小红获得的手牌为a2、a4、...、an,并且置换a1、an,最后判断即可

        但可以通过数学证明,小红不可能取胜,顶多打平。若数组的最大值和最小值相等,则平局,否则的话,小紫通过置换最大值和最小值的优势,小红每次取牌获取的优势总和难以大于小紫通过置换的优势,小紫获胜

2.代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
 
const int N = 1e3+7;
int a[N];
 
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    int hong = 0;
    int zi = 0;
    for(int i=2;i<=n-2;i+=2){
        hong+=a[i];
        zi+=a[i+1];
    }
    zi+=a[n];
    hong+=a[1];
    if(zi>hong){
        cout<<"yukari"<<endl;   
    }else if(zi==hong){
        cout<<"draw"<<endl;
    }else{
        cout<<"kou"<<endl;
    }
}
 
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
 
const int N = 1e3+7;
int a[N];
 
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    if(a[1]==a[n]){
        cout<<"draw"<<endl;
    }else{
        cout<<"yukari"<<endl;
    }
}
 
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

D.医生

1.思路

        将每个病人的情况以及药物的情况以十进制的方式进行储存。暴力枚举所有的情况,总共有2^k种情况,对于每种情况,当以二进制的方式存储的时候,对应位置的值为1,说明选择该种药物,将药物添加到x中,若(x&a[i])==a[i],说明能治愈该病人,则进行ans的更新,最后输出最小的ans即可

2.代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e4+7;
int a[N],b[N];

signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        for(int j=0;j<m;j++){
            if(s[j]=='1'){
                a[i] |= (1<<j);
            }
        }
    }
    int k;
    cin>>k;
    for(int i=1;i<=k;i++){
        string s;
        cin>>s;
        for(int j=0;j<m;j++){
            if(s[j]=='1'){
                b[i] |= (1<<j);
            }
        }
    }
    for(int i=1;i<=n;i++){
        int ans = 0x3f3f3f;
        for(int t=0;t<(1<<k);t++){
            int x = 0;
            int count = 0;
            for(int j=0;j<k;j++){
                if(t>>j&1){
                    x |= b[j+1];
                    count++;
                }
            }
            if((x&a[i])==a[i]){
                ans = min(ans,count);
            }
        }
        if(ans==0x3f3f3f){
            ans = -1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

E.F.降温

1.思路

        利用两个数组来保存最大寒潮和最小寒潮对应的温度情况。并且对于未知的气温,最大寒潮:若能和前一天达成寒潮则进行x的降温,否则升至最大气温,尽可能满足之后的寒潮情况;最小寒潮:尽可能去降温,减少寒潮的次数,若能和前一天正好达成不是寒潮的情况,则降温(x-1),否则直接降至最低温

2.代码(以F题为准,两题只需修改数据范围)

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5+7;
const int temp = 5e8;
const int wz = -999999999;
int a[N],b[N];
int cta=0,ctb=0;

signed main(){
    int n,x;
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        int t;
        cin>>t;
        a[i] = t;
        b[i] = t;
    }
    if(a[1]==wz){
        a[1] = temp;
        b[1] = -temp;
    }
    for(int i=2;i<=n;i++){
        if(a[i]==wz){
            if(a[i-1]-x<-temp){
                a[i] = temp;
            }else{
                a[i] = a[i-1]-x;
            }
            b[i] = max(b[i-1]-(x-1),-temp);
        }
        if(a[i-1]-a[i]>=x){
            cta++;
        }
        if(b[i-1]-b[i]>=x){
            ctb++;
        }
    }
    cout<<cta<<" "<<ctb<<endl;
    return 0;
}

G.乌鸦

偶不会,待补。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值