题解 | 2023牛客寒假算法基础集训营1

A World Final? World Cup! (I)

题目

https://ac.nowcoder.com/acm/contest/46800/A

附图

思路

写的一般,参考即可

思路是

分别记录双方赢的场次

1.当双方比分差距超过3就没必要比了,直接结束

2.计算如果一方赢下接下来的所有比赛能不能赶上甚至超过对方,如果可以,继续执行循环;不行的话直接结束比赛

  1. 所有比赛结束,双方比分相等的话就打平,输出-1就行

参考代码c++

#include <iostream>
using namespace std;

int main() {
    int t,m,n,flag,mm,nn;
    string a;
    cin>>t;
    while(t--){
        m=0;n=0;flag=0;mm=0;nn=0;
        cin>>a;
        for(int i=0;i<=9;i++){
            if(i%2==0){
                if(a[i]=='1'){
                    m++;
                }
                mm++;
            }else{
                if(a[i]=='1'){
                    n++;
                }
                nn++;
            }
            if((m-n>=3||n-m>=3)&&i%2==1){
                flag=i+1;
                break;
            }
            if(m>n+5-nn||n>m+5-mm){
                flag=i+1;
                break;
            }
        }
        if(m==n){
            cout<<"-1"<<endl;
        }else if(flag!=0){
            cout<<flag<<endl;
        }
    }
}

D 现在是,学术时间 (II)

题目

https://ac.nowcoder.com/acm/contest/46800/D

附图(点击查看大图)

思路

这题没啥花里胡哨的

就是计算面积时注意别写错符号变量啥的

思路是

矩形面积=长*宽(长:x大-x小 ; 宽:y大-y小)

不想判断哪个变量大还是小就活用max()min()函数,或者直接相减时用绝对值abs()函数

两矩形并集面积得算 (可以看下我代码,这里容易写乱)

两矩形交集面积为两矩形面积之和减去并集面积 s1+s2-s并

第二个矩形未知点的选取是第一个矩形其中的一个端点

至于选取哪个,写数组把四个端点记录下来,用一个变量每次比较判断一下结果就行(我没用max变量,会与max函数冲突)

参考代码c++

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

int main() {
    int x, y, xp, yp, t, s1, s2, s3, s4, s5;
    double res, max1;
    cin>>t;
    while (t--) { // 注意 while 处理多个 case
        cin >> x >> y >> xp >> yp;
        max1=0;
        s1=x*y;
        
        int xm[]={0,0,x,x};
        int ym[]={0,y,0,y};
        
        for(int i=0;i<4;i++){
            s2=abs(xp-xm[i])*abs(yp-ym[i]);
            s3=s1+s2;
            s4=abs(min(x,max(xp,xm[i]))-max(min(xp,xm[i]),0))*abs(min(y,max(yp,ym[i]))-max(min(yp,ym[i]),0));
            s5=s3-s4;
            res=s4*1.0/s5;
            if(max1<res){
                max1=res;
            }
        }
        cout<<max1<<endl;
    }
}

H 本题主要考察了DFS

题目

https://ac.nowcoder.com/acm/contest/46800/H

附图(点击查看大图)

思路

这题也没啥花里胡哨的

不过本人没用DFS

观察题目可以发现所有拼图的1和2缺口的总和数量是一样

思路是记录1和2缺口的数量,然后计算就好

参考代码c++

#include <iostream>
using namespace std;

int main() {
    int t, n, a, b, x, y;
    string m;
    cin>>t;
    while(t--){
        cin>>n;
        x=0;y=0;
        n=n*n-1;
        while(n--){
            cin>>m;
            for(int i=0;i<4;i++){
                if(m[i]=='1'){
                    x++;
                }else if(m[i]=='2'){
                    y++;
                }
            }
        }
        cout<<10+x-y<<endl; 
    } 
}

K 本题主要考察了dp

题目

https://ac.nowcoder.com/acm/contest/46800/K

附图(点击查看大图)

思路

不过本人没用dp,总结了规律写的

其实思考后可以想出当字符是100100100100...这样时坏区间总数最少,只要考虑最后那段就行,因为前面不存在坏区间

只要考虑字符串最后的情况就行

...100100

...100101

...100111

...101111

大概就这么几种,会发现从某一位置后都是坏区间,只要找准那个位置就可以了

当然切记不要忘了考虑n==m的情况!!!

参考代码c++

#include <iostream>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    if(n==m){
        cout<<n-2;
    }else if((n-1)/3+1>=m){
        cout<<0;
    }else{
        cout<<m-((n-m)/2+1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值