牛客小白月赛53【比赛记录】

ABC 注意小坑即可

D-Breezing

        读题即可发现,每个位置都是选择边界值才能使答案最大,故dp即可;

        dp[i][0]表示第i个位置选择1,dp[i][1]表示第i个位置选择Bi,然后转移即可。

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int dp[Max][2];
int a[Max];
int main(){
    int n;sc(n);
    for(int i=1;i<=n;i++) sc(a[i]);
    for(int i=2;i<=n;i++){
        dp[i][0]=max(abs(1-1)+dp[i-1][0],abs(a[i-1]-1)+dp[i-1][1]);
        dp[i][1]=max(abs(a[i]-1)+dp[i-1][0],abs(a[i-1]-a[i])+dp[i-1][1]);
        
    }
    cout<<max(dp[n][0],dp[n][1])<<endl;
}

E-Calling

        贪心即可,边长为4,5,6的正方形显然一张纸片就要一个框,多余的部分先放放边长为2的,没填满再放边长为1的正方形;边长为3的正方形,一个框可放4个,多余的部分先放放边长为2的,没填满再放边长为1的正方形;边长为2的正方形,一个框可放9个,多余的部分放边长为1的正方形;边长为2的正方形,哪里有空往哪放。

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
ll a[Max];
int main(){
    int t;sc(t);
    while(t--){
        int n;sc(n);
        for(int i=1;i<=6;i++) sl(a[i]);
        bool flag=true;
        for(int i=6;i>=1;i--){
            if(a[i]<=0) continue;
            if(i==6) n-=a[i];
            if(i==5){
                n-=a[i];a[1]-=(a[i]*11);
            }
            if(i==4){
                n-=a[i];
                ll ans=a[i]*5;
                if(a[2]>=ans) a[2]-=ans;
                else a[2]=0,a[1]-=(ans-a[2])*4;
            }
            if(i==3){
                if(a[i]%4==0) n-=a[i]/4;
                else{
                    n-=a[i]/4;n--;
                    ll ans;
                    if(a[i]%4==1) ans=5;
                    else if(a[i]%4==2) ans=3;
                    else if(a[i]%4==3) ans=1;
                    if(a[2]>=ans) a[2]-=ans;
                    else{
                        a[2]=0;
                        ll num=36-(a[i]%4)*9-ans*4;
                        a[1]-=num;
                    }
                }
            }
            if(i==2){
                if(a[i]%9==0) n-=a[i]/9;
                else{
                    n-=a[i]/9;n--;a[i]=0;
                    a[1]-=(36-(a[i]%9)*4);
                }
            }
            if(i==1){
                if(a[i]%36==0) n-=a[i]/36;
                else n-=a[i]/36,n--;
            }
            if(n<0) flag=false;
        }
        if(flag) printf("Yes\n");
        else printf("No\n");
    }
}

 F-Freezing

下面是官方题解

        这里我觉着可以将dp[x][y]理解为,以前八位为x,后八位与y相与为0组成的16位二进制数结尾的所有可能性!!!

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
// ll a[Max];
ll dp[1<<8][1<<8];
int main(){
    int n,m;
    sc(n);sc(m);
    ll ans=0;
    while(n--){
        string str;cin>>str;
        int a=0;
        for(int i=0;i<m;i++){
            a=(a<<1)|(str[i]=='o');
        }
        int x=a>>8,y=a&255;ll z=1;
        for(int i=0;i<(1<<8);i++){
            if(!(x&i)){
                z+=dp[i][y];z%=mod;
            }
        }
        ans+=z;ans%=mod;
        for(int i=0;i<(1<<8);i++){
            if(!(y&i)){
                dp[x][i]+=z;dp[x][i]%=mod;
            }
        }
    }
    cout<<ans<<endl;
}

总结:D题没有瞬间想到dp,E代码有很多小错误wrong了好久,F是一个很妙的trick!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瘾ิۣۖิۣۖิۣۖิꦿ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值