牛客小白月赛83 答案整理

文章介绍了五个C++编程题目,涉及递归、排序算法、区间查询数据结构(BIT)以及贪吃蛇游戏的解决方案,展示了算法在解决实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A 小天的金银铜铁

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
    int a,b,c,d,e;cin>>a>>b>>c>>d>>e;
    int A,B,C,D;cin>>A>>B>>C>>D;
    int sum=0;
    sum+=A*a+b*B+c*C-D*d;
    if(sum>e) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

 B 小天的魔法

#include<bits/stdc++.h>
using namespace std;
int n,m,x,a[105],b[105];
long long ans,num;
int main()
{
	cin>>n>>m>>x;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<m;i++){
		cin>>b[i];
	}
	sort(a,a+n);
	sort(b,b+m);
	for(int i=m-1,j=n-1;i>=0;i--,j--){
		num++;
		if(x<=ans+b[i]){
			cout<<num;
			break;
		}
        else if(a[j]==0||a[j]==1){
            ans+=b[i];
        }else{
		num++;
		ans+=a[j]*b[i];
		if(x<=ans){
			cout<<num;
			break;
		  }
        }
		if(i==0){
			cout<<"-1";
		}
	}
	return 0;
}

C 小天的Minecraft

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    double a=0.0, b=0.0, c=0.0;
    double l;
    cin >> t;
    for(int i=0; i<t; i++)
    {
        std::cin >> a >> b >> c;
        a = a / 16;
        b = b / 16;
        c = c / 16;
        l = pow(a, 16) + 1820 * pow(a, 12) * (pow(b, 4) + pow(c, 4));//1820为排列组合数
        cout << fixed<< setprecision(10)<< l <<endl;
    }
    return 0;
}

 D 小天的子序列

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int n,m;
string s;
int f[26][26][501],c[501][501];
signed main()
{
    cin>>n>>s;
    s=" "+s;
    c[0][0]=1;
    for(int i=1;i<=500;i++)
    {
        c[0][i]=1;
        for(int j=1;j<=i;j++)
        {
            c[j][i]=(c[j-1][i-1]+c[j][i-1])%mod;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            f[s[i]-'a'][s[j]-'a'][j-i+1]++;
        }
    }
    cin>>m;
    while(m--)
    {
        char x,y;
        int l;
        cin>>x>>y>>l;
        int ans=0;
        for(int i=l;i<=n;i++)
        {
            ans=(ans+f[x-'a'][y-'a'][i]*c[l-2][i-2])%mod;
        }
        cout<<ans<<endl;
    }
    
}

E 小天的贪吃蛇

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

void solve() {
	int n, m;
	cin >> n >> m;
	auto a = [&](int i, int j) {
        if (i % 2) { return (i - 1) * m + j; }
        return i * m - j + 1;
    };
    auto b = [&](int i, int j) {
        if (j % 2) { return (j - 1) * n + i; }
        return j * n - i + 1;
    };
	vector<char> va(n * m + 2), vb(n * m + 2);
	set<int> sa, sb;
	
	auto change = [&](vector<char> &v, set<int> &s, int i, int c) {
		s.erase(i);
		s.erase(i + 1);
		v[i] = c;
		if(v[i] != v[i - 1]) s.insert(i);
		if(v[i] != v[i + 1]) s.insert(i + 1);
	};
	
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= m;j++) {
			char c;
			cin >> c;
			change(va, sa, a(i, j), c);
			change(vb, sb, b(i, j), c);
		}
	}
	
	int q;
	cin >> q;
	for(int i = 0, op, x, y;i < q;i++) {
		cin >> op >> x >> y;
		if(op == 1) {
			char c;
			cin >> c;
			change(va, sa, a(x, y), c);
			change(vb, sb, b(x, y), c);
		}
		else if(op == 2) {
			cout << *sa.upper_bound(a(x, y)) - a(x, y) << '\n';
		}
		else {
			cout << *sb.upper_bound(b(x, y)) - b(x, y) << '\n';
		}
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int T = 1;
	//cin >> T;
	while(T -- ) {
		solve();
	}
	return 0;
}

F 小天的A+B

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int mod = 998244353;
int n, m;
struct BIT {
    vector<int>v;
    BIT(int n) {
        v.resize(n + 1, 0);
    }
    int query(int l, int r) {
        return sum(r) - sum(l - 1);
    }
    int sum(int i) {
        int s = 0;
        while (i > 0) {
            s += v[i];   
            i = i & (i - 1);
        }
        return s;
    }
    void add(int i, int x) {
        while (i <= n) {
            v[i] += x;
            i += i & -i;
        }
    }
};
void solve()
{
    scanf("%d%d", &n, &m);
    vector<int>a(n + 1);
    vector<ll>pw2(n + 1);
    pw2[0] = 1;
    for (int i = 1; i <= n; i++)pw2[i] = pw2[i - 1] * 2 % mod;
    BIT pos(n), zero(n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        if (a[i] > 0)pos.add(i, 1);
        if (a[i] == 0)zero.add(i, 1);
    }
    while (m--) {
        int op, x, y;
        scanf("%d%d%d", &op, &x, &y);
        if (op == 1) {
            if (a[x] > 0)pos.add(x, -1);
            if (a[x] == 0)zero.add(x, -1);
            a[x] += y;
            if (a[x] > 0)pos.add(x, 1);
            if (a[x] == 0)zero.add(x, 1);
        } else {
            if (pos.query(x, y) == 0 && zero.query(x, y) == 0) {
                int L = max(x, y - 33);
                ll ans = x == L ? a[L] : max(a[L-1],a[L]) * 2;
                for (int i = L + 1; i <= y; i++) {
                    ans = 2 * max(ans, 0ll + a[i]);
                }
                ans %= mod;
                ans += mod;
                ans %= mod;
                printf("%lld\n", ans);
            } else if (pos.query(x, y) > 0) {
                int l = x, r = y+1;
                while (l < r) {
                    int mid = l + r >> 1;
                    if (pos.query(l, mid) > 0) {
                       r=mid;
                    } else {
                        l = mid+1;
                    }
                }
                
                int R = min(l + 32, y);
                ll ans = x == l ? a[l] :max(a[l-1],a[l]) * 2;
                int left = y - R;
                for (int i = l + 1; i <= R; i++){
                    ans = max(ans, 0ll + a[i]) * 2;
                    if(ans>0x3f3f3f3f){
                        left=y-i;
                        break;
                    }
                }
                ans %= mod;
                ans *= pw2[left];
                ans %= mod;
                printf("%lld\n", ans);
            } else {
                puts("0");
            }
        }
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    int tt_ = 1;

    // scanf("%d", &tt_);

    for (int tt = 1; tt <= tt_; tt++) {
        solve();
    }
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+5;
const int mod = 998244353;
int pw[N];
int a[N];
signed main(void){
	ios::sync_with_stdio(false);cin.tie(0);
	pw[0]=1;
	for(int i=1;i<N;i++) pw[i]=(pw[i-1]<<1)%mod;//pw[i]表示2的i次幂对mod取模的结果。
	int n,m;
	cin>>n>>m;
	set<int>pos,zero;
	pos.insert(1e18);
    zero.insert(1e18);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]>0) pos.insert(i);
        if(!a[i]) zero.insert(i);
	}
	while(m--){
		int opt,l,r;
		cin>>opt>>l>>r;
		if(opt==1){
			a[l]+=r;
			if(a[l]>0) pos.insert(l);
			else if(pos.count(l)) pos.erase(l);
            if(!a[l]) zero.insert(l);
            else if(zero.count(l)) zero.erase(l);
		}
		else{
			int ll=*pos.lower_bound(l);
            int l2=*zero.lower_bound(l);
			if(ll>r){
                if(l2<=r){
                    cout<<"0\n";
                    continue;
                }
                int p=max(l,r-30);
				int res=a[p];
                for(int i=p+1;i<=r;i++)
					res=max(res,a[i])<<1;
				res%=mod;
				res=(res+mod)%mod;
				cout<<res<<"\n";
			}
			else{
				int res=a[ll];
                if(ll!=l) res<<=1;
				for(int i=ll+1;i<=r;i++){
					res=max(res,a[i])<<1;
				    if(res>1e9){
                        res%=mod;
						res=res*pw[r-i]%mod;
						break;
					}
				}
				cout<<res%mod<<"\n";
			}
		}
	}
	return 0; 
}

 

 

牛客小白月赛83_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值