牛客小白月赛99部分题解

比赛地址:牛客小白月赛99_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ


A.材料打印

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

void solve() {
    ll a,b,c,d;
    cin>>a>>b>>c>>d;
    if(c<d)
    cout<<a*c+b*d<<endl;
    else
    {
        cout<<(a+b)*d<<endl;
    }
    
    
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
} 


B.%%%

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

void solve() {
    ll n,cnt;
    cin>>n;
    if(n==0)
    {
        cout<<0<<endl;
        return;
    }
    while(1)
    {
            if(n==0)
            {
                cout<<cnt<<endl;
                return;
            }
            if (n & 1)
            {
                n = n % ((n + 1) / 2);
            }
            else 
            {
                n = n % (n / 2 + 1);
            }
            cnt++;
    }
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
} 


C.迷宫

这题有点难绷,前面一直超时

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int map1[1010][1010];
bool visited[1010][1010];
bool logs[1010][1010];
ll a,b;
int direction[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
queue<pair<int,int> > q;
bool dfs(int x, int y, int end_x, int end_y) {
    // 如果当前位置超出了边界或已经访问过,返回 false
    if (x < 1 || x > a || y < 1 || y > b || visited[x][y] || map1[x][y] != 1) {
        return false;
    }

    // 如果当前位置是终点,返回 true
    if (x == end_x && y == end_y) {
        return true;
    }

    // 标记当前位置为已访问
    visited[x][y] = true;

    // 尝试四个方向移动
    if (dfs(x - 1, y, end_x, end_y)) return true; // 上
    if (dfs(x + 1, y, end_x, end_y)) return true; // 下
    if (dfs(x, y - 1, end_x, end_y)) return true; // 左
    if (dfs(x, y + 1, end_x, end_y)) return true; // 右

    // 如果没有找到路径,回溯
    return false;
}
void dfs1(int x, int y,int key) {
    if (x < 1 || x > a || y < 1 || y > b || visited[x][y] || map1[x][y] == 2) {
        return;
    }

    if (map1[x][y]==1) {
    	if(key)
    	{
    		map1[x][y]=9;
		}
        else
        {
        	q.push({x,y});
		}
    }

    // 标记当前位置为已访问
    visited[x][y] = true;

    // 尝试四个方向移动
    dfs1(x - 1, y,key);
    dfs1(x + 1, y,key);
    dfs1(x, y - 1,key);
    dfs1(x, y + 1,key);
}
void solve() {
    ll c,d;
    cin>>a>>b;
    char s;
    memset(map1,0,sizeof(map1));
    int numx,numy,end_x,end_y;
    for(c=1;c<=a;c++)
	{
		for(d=1;d<=b;d++)
		{
			cin>>s;
			if(s=='.')
			{
				map1[c][d]=1;
			}
			else if(s=='#')
			{
				map1[c][d]=2;
			}
			else if(s=='S')
			{
				numx=c;
				numy=d;
				map1[c][d]=1;
			}
			else if(s=='E')
			{
				end_x=c;
				end_y=d;
				map1[c][d]=1;
			}
		}
	}
	if(dfs(numx,numy,end_x,end_y))
	{
		cout<<"YES";
		return;
	}
	memset(visited,0,sizeof(visited));
	dfs1(end_x,end_y,0);
    memset(visited,0,sizeof(visited));
	dfs1(numx,numy,1);


    /*
    for(c=1;c<=a;c++)
	{
		for(d=1;d<=b;d++)
		{
            cout<<map1[c][d];
        }
        cout<<endl;
    }*/
    memset(logs,0,sizeof(logs));
	while(!q.empty())
	{
		pair<int,int> i1=q.front();
		int num1=i1.first;
		int num2=i1.second;
		q.pop();
        if(logs[num1][num2])
        {
               
        }
        else
        {
            logs[num1][num2]=1;
        }
		int x,y,x1,y1;
		for(int v1=0;v1<=3;v1++)
		{		
			x=num1+direction[v1][0];
			y=num2+direction[v1][1];
			//左 
            if(logs[x][y])
            {
                continue;
            }
            else
            {
                logs[x][y]=1;
            }
            x1=x;
            y1=y;
			while(x1>=1&&y1>=1&&x1<=a&&y1<=b)
			{
				if(map1[x1][y1]==9)
				{
					cout<<"YES";
					return; 
				}
				x1--;
			}
			//上 
            x1=x;
            y1=y;
			while(x1>=1&&y1>=1&&x1<=a&&y1<=b)
			{
				if(map1[x1][y1]==9)
				{
					cout<<"YES";
					return; 
				}
				y1++;
			}
			//下 
            x1=x;
            y1=y;
			while(x1>=1&&y1>=1&&x1<=a&&y1<=b)
			{
				if(map1[x1][y1]==9)
				{
					cout<<"YES";
					return; 
				}
				y1--;
			}
			//右 
            x1=x;
            y1=y;
			while(x1>=1&&y1>=1&&x1<=a&&y1<=b)
			{
				if(map1[x1][y1]==9)
				{
					cout<<"YES";
					return; 
				}
				x1++;
			}
		}
		
	}
	cout<<"NO"; 
	return;
    
}

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


D.又是一年毕业季

暴力

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, M = 110, mod = 998244353, inf = 2e9;
typedef pair<int, int> pt;
typedef long long ll;
 
bool isprime(int x) {
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return 0;
    }
    return 1;
}

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    map<int, int> mp;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        mp[a[i]]++;
    }
    sort(a.begin(), a.end());
    for (int i = 2; i <= a[n - 1] + 100; i++) {
        if (isprime(i) && !mp.count(i)) {
            cout << i << endl;
            return;
        }
    }
}   
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

根据用户提供的关键词“小A 弹吉他 网 小白 108 比详情 参攻略”,以下是整合后的相关信息和建议: --- ### 关于小白108的比详情 小白是由网主办的一系列面向编程爱好者的在线竞赛之一。第108场事通常会围绕算法、数据结构以及实际问题解决能力展开挑战。比题目可能涉及但不限于字符串处理、动态规划、图论等领域。 对于与“小A弹吉他”相关的具体题目,可能是某道以音乐或乐器为主题的趣味性算法题。这类题目往往需要结合数学建模能力和逻辑推理技巧来完成解答。 --- ### 如何准备此类比? #### 方法一:熟悉常见算法模板 确保掌握基础的数据结构(如栈、队列)及经典算法模型(例如深度优先搜索DFS、广度优先搜索BFS)。针对可能出现的音符序列匹配或者节奏计算等问题提前复习KMP模式匹配法等相关知识点。 #### 方法二:模拟真实考场环境练习 利用过往的小白记录进行刷题训练,在规定时间内尝试独立解决问题从而提升临场发挥水平。同时注意控制提交频率避免因超时错误而扣分过多。 #### 方法三:学习优秀选手思路分享 访问社区查看往届高排名玩家的经验贴。他们可能会提到如何快速理解复杂描述型试题的方法论;也可能提供一些特别好用但容易被忽略掉的小技巧比如调试输出设置等细节优化方案。 --- ### 示例代码片段供参考(假设存在一个简单版本的问题) 如果遇到类似判断两个旋律是否相同类型的程序设计,则可以考虑如下实现方式: ```python def is_same_melody(melody_a, melody_b): return melody_a == melody_b melody_A = list(map(int, input().split())) melody_B = list(map(int, input().split())) if len(melody_A) != len(melody_B): print("No") else: if is_same_melody(melody_A,melody_B): print("Yes") else: print("No") ``` 此段落仅为示意用途,请依据实际情况调整适应不同难度等级下的业务场景需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值