牛客小白月赛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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值