2024牛客暑期多校训练营5赛后补题

2024牛客暑期多校训练营5 赛后补题

B.珑

题意:若干 2 × 1 2\times 1 2×1的多米诺骨牌去填充 n × m n\times m n×m的矩形,有两种规则,规则一:短边不能相接;规则二:长边不能相接。
题解:
无规则:除了两边均是奇数的一定可以;
两规则都有:只能是 1 × 2 1\times 2 1×2 2 × 1 2\times 1 2×1的矩形可以;
只有规则一:除去 1 × 2 n 1\times 2n 1×2n 2 n × 1 2n\times 1 2n×1其他都可以。
只有规则二:只能是 1 × 2 n 1\times 2n 1×2n 2 n × 1 2n\times 1 2n×1

#include <bits/stdtr1c++.h>
using namespace std;
#define int long long
const int maxn = 2e5+100;
#define endl "\n"
int b[maxn];
int a[maxn];
void fast()
{ios::sync_with_stdio(false); cin.tie(0);  cout.tie(0);}
void solve ()
{
    int n,m,a,b;
    cin >>n >>m>>a>>b;
    bool flag =0;
    if( a ==1 && b ==1){ //约束都不在
        if( m%2 ==0 || n%2 ==0)  flag =1;  //任意一边为偶数即可
        else { //两边都是奇数不可以
            flag =0;
        }
    }
    else if (a ==0 && b ==0){ //都存在
        if(m==1 && n==2 || n==1 && m==2) flag =1;
        else flag =0;
    }
    else if (a ==0 && b ==1){  //短边不,长边可
        if( m%2 ==1 && n%2 ==1) flag =0;
        else if ( m%2 ==0 && n%2 ==0) flag =1;
        else { //一偶一奇
            int p,q;  //p奇q偶
            if( n%2 ==1) p=n,m=q;
            else q =n, p=m;
            if( p%3 ==2 || p%3 ==0) flag =1;
            else {  //余数为1
                if((m==1 || n==1) && max(m,n)>2) flag =0;
                else flag =1;
            }
        }
    }
    else {  //短边可长边不
        if(n == 1 && m % 2 == 0){
				flag =1;	
			} 
			else if(m == 1 && n % 2 == 0){
				flag =1;	
			} 
			else {
				flag =0;	
			}
    }
    if(flag) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}
signed main ()
{
    fast();
    int t; cin >> t;
    while(t--){
        solve();
    }
}

E.安

题意:May和Ray各有 n n n个骑士,分别按照顺序站成一排,编号为 1   n 1~n 1 n,其中,May的骑士生命值为 a i a_{i} ai,Ray的骑士生命值为 b i b_{i} bi,每次选择编号为 i i i的骑士攻击对方骑士,使对方骑士生命值减一,May先行,问May最后剩余多少骑士。
题解: ⌈ ∑ ( a i = b i ) 2 ⌉ \lceil\frac{\sum(a_{i} = b_{i})}{2}\rceil 2(ai=bi)+ ∑ ( a i > b i ) \sum(a_{i}>b_{i}) (ai>bi)

#include<bits/stdtr1c++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn = 1e5+20;
int a[maxn];
int b[maxn];
void solve(){
    int ans =0;
    int cnt =0;
    int n; cin >> n;
    for(int i=1 ;i<=n;i++){
        cin >> a[i];
    }
    for(int i=1 ;i<=n;i++){
        cin >> b[i];
    }
    for(int i=1;i<=n;i++){
        if(a[i] >b[i]) ans++;
        else if( a[i] == b[i]) cnt++;
    }
    ans = ans+ ceil(1.0*cnt/2);
    cout<<ans<<endl;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

L.知

题是队友AC的

#include <bits/stdtr1c++.h>
//I
using namespace std;
#define int long long
const int maxn = 150;
#define endl "\n"
const int mod = 998244353;
int a[maxn];
void fast()
{ios::sync_with_stdio(false); cin.tie(0);  cout.tie(0);}
void solve ()
{
    int n; cin >> n;
    int ans =1;
    for(int i=1;i<=n; i++){
        cin >> a[i];
    }
    int cnt =1; int sum =0;
    while( sum <1000000 && cnt>0 ){
        cnt =0;
        sum++;
        for(int i=n; i>=2;i--){
            if(a[i] >a[i-1]){
                a[i]--; a[i-1]++;
                cnt++; 
            }
        }
    }
    for(int i=1;i<=n;i++){
        ans = (ans*(a[i]%mod))%mod;
    }
    cout<<ans<<endl;
    memset(a,0,sizeof(a));
}
signed main ()
{
    fast();
    int t; cin >> t;
    while(t--){
        solve();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yi壹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值