"华为杯"中国矿业大学程序设计学科竞赛重现赛

B.A题

题目链接:https://ac.nowcoder.com/acm/contest/948/B

题意:有两种传送门,第一种是从编号小的到编号大的,第二种相反.问能否从A到B

题解:

1.A没有神奇,否

2.B没有传送门,否

3.A有神奇B有神奇,是

4.A有神奇B有奇神,枚举B右面的城市,是否有既有神奇又有奇神的城市,有:是,没有:否

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=1e3+5;
const int mod=998244353;
int a[N],b[N];
int main(){
        int n,x;
        while(~scanf("%d%d",&n,&x)){
                for(int i=1;i<=n;i++) scanf("%d",&a[i]);
                for(int i=1;i<=n;i++) scanf("%d",&b[i]);
                if(a[1]==0) puts("NO");
                else if(a[x]==0&&b[x]==0) puts("NO");
                else if(a[x]==1) puts("YES");
                else if(b[x]==1){
                        int f=0;
                        for(int i=x+1;i<=n;i++) if(a[i]&b[i]){puts("YES");f=1;break;}
                        if(!f) puts("NO");
                }
        }
    return 0;
}
C.均分糖果

题目链接:https://ac.nowcoder.com/acm/contest/948/C

题意:一个数列,每次操作是将某个数的(部分)值加到相邻的数上,求最小的操作,使每个数相同.

题解:先计算均值,按某个方向开始(从左往右)枚举每个数,如果这个数大于均值,将与均值的差值加到相邻的数上.如果这个数小于均值,则将从相邻的数那里将差值补齐;如果相等,则不动.

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=1e2+5;
const int mod=998244353;
int a[N];
int main(){
        int n;
        while(~scanf("%d",&n)){
                int tot=0;
                for(int i=1;i<=n;i++){
                        scanf("%d",&a[i]);tot+=a[i];
                }
                tot/=n;
                int ans=0;
                for(int i=1;i<=n;i++){
                        if(a[i]<tot) a[i+1]-=(tot-a[i]);
                        else if(a[i]>tot) a[i+1]+=(a[i]-tot);
                        else ans++;
                }
                printf("%d\n",n-ans);
        }
    return 0;
}
E.很简单的题。。。。。。(暴力.........)

题目链接:https://ac.nowcoder.com/acm/contest/948/E

题意:统计[l,r]中2出现的次数(第一眼以为是数位dp,看看数据范围,原来是暴力,233333)

题解:暴力

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=2e5+5;
const int mod=998244353;
int ck(int x){
    int ans=0;
    while(x>0){
        if(x%10==2) ans++;
        x/=10;
    }
    return ans;
}
int main(){
    int l,r;
    scanf("%d%d",&l,&r);
    int ans=0;
    for(int i=l;i<=r;i++){
        ans+=ck(i);
    }
    printf("%d\n",ans);
    return 0;
}
F.最大公约数和最小公倍数问题(暴力.......暴力.........)

题目链接:https://ac.nowcoder.com/acm/contest/948/F

题解:p*q/gcd(p,q)=lcm(q,p);

(暴力大法好)

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=2e5+5;
conI.I.st int mod=998244353;

int main(){
        int x0,y0;
        while(~scanf("%d%d",&x0,&y0)){
                ll tmp=(ll)x0*y0;
                int ans=0;
                for(int i=x0;i<=y0;i+=x0){
                        if(tmp%i==0&&__gcd(i,(int)tmp/i)==x0) ans++;

                }
                printf("%d\n",ans);
        }

    return 0;
}
G.毕业生的纪念礼物(优先队列)

题目链接:https://ac.nowcoder.com/acm/contest/948/G

题意:每个毕业生分得三种不同的纪念品.要使这批礼物分给尽量多的毕业生.

题解:

数据给的是n个礼物,先统计一下礼物的种类和数量.

将礼物尽量多得分出去,那么剩下的要尽量少.比如:1,2,3,4.

从小到大取,只能给2个毕业生发礼物,剩下:0,0,1,3

从大到小取,可以给3个毕业生发礼物0,0,0,1;

可见从大到小取,剩下的礼物越少,

每取一次就要重新排序一次,这个就想到了优先队列.

(菜鸡一个,只能这么猜测)

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=1e5+5;
const int mod=998244353;
int a[N];
map<int,int> mp;
priority_queue<int,vector<int>,less<int> >q;
int main(){
        int n;
        scanf("%d",&n);
        int tmp;
        //int cnt=0;
        int tot=0;
        for(int i=1;i<=n;i++){
                scanf("%d",&tmp);
                if(mp[tmp]==0) mp[tmp]=++tot;
                a[mp[tmp]]++;
        }
        n=tot;
        ll  ans=0;
        for(int i=1;i<=n;i++) q.push(a[i]);
        while(q.size()>2){
                int a=q.top();q.pop();
                int b=q.top();q.pop();
                int c=q.top();q.pop();
                a--;
                b--;
                c--;
                ans++;
                if(a>0) q.push(a);
                if(b>0) q.push(b);
                if(c>0) q.push(c);
        }
        cout<<ans<<endl;
    return 0;
}
I.你的粪坑v1

题目链接:https://ac.nowcoder.com/acm/contest/948/I

题意:模拟石头剪刀布

#include <bits/stdc++.h>
#define P pair<char,char>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=2e5+5;
const int mod=998244353;
int ck(char a,char b){
        if(a=='j'&&b=='s') return 0;
        if(a=='s'&&b=='j') return 1;
        if(a=='s'&&b=='b') return 0;
        if(a=='b'&&b=='s') return 1;
        if(a=='j'&&b=='b') return 1;
        return 0;
}
int main(){
        int t;
        cin>>t;
        while(t--){
                string a,x,b,y;
                cin>>a>>x>>b>>y;
                if(x==y) puts("yi qi chi shi.");
                else if(ck(x[0],y[0])) cout<<b<<" chishi."<<endl;
                else cout<<a<<" chishi."<<endl;
        }
    return 0;
}
K.你的Alice

题目链接:https://ac.nowcoder.com/acm/contest/948/K

题解:

#include <bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
typedef long long ll;
 
const int N=2e5+5;
const int mod=998244353;

int main(){
        ll a,b;
        cin>>a>>b;
        if((a/b)%2==0) puts("NO");
        else puts("YES");
    return 0;
}

转载于:https://www.cnblogs.com/-yjun/p/11144048.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值