华北水利水电大学新生校赛热身赛

A.斐波那契数列

  • 知识点:循环
  • 难度:简单
  • 题解:简单的循环找出斐波那契数列的第n项然后输出即可。
  • 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() 
{
	int x=1, y=1,z,n;
	cin >> n;
	n--;
	while(n--)
	{
		z = x + y;
		x = y;
		y = z;
	}
	cout << x;
}

B.牛牛的装球游戏

  • 知识点:计算
  • 难度:简单
  • 题解:简单的计算题,具体计算公式代码中写出
  • 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pi 3.141592653589
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		ll r, h;
		cin >> r >> h;
		ll n = h / (2 * r);
		double sum = pi * double(r * r * h) - (4.0 * pi * double(r * r * r * n) / 3.0);
		printf("%.3lf", sum);
	}
}

C.兔子的序列

  • 知识点:计算
  • 难度:简单
  • 题解:简单的找到最大的非完全平方数的算法,可以通过循环判断一个数是否是完全平方数。
  • 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	int n;
	cin >> n;
	int flag = -1;
	while(n--)
	{
		int x,y;
		cin>>x;
		if(x>flag)
		{
			for (y = 1; y * y <= x;y++)
			{
				if(y*y==x)
				break;
			}
			if(y*y!=x)
			{
				flag = x;
			}
		}
	}
	cout << flag;
}

D.扫雷

  • 知识点:模拟
  • 难度:中等
  • 题解:对于每个点,若其不是雷,查询他周围几个位置是否为雷,然后将其计算出来输出即可。
  • 代码:
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
int a[1008][1008];
void solve()
{
    int n,m;
    cin>>n>>m;
    string s[n];
    for(int i=0;i<n;i++)
    cin>>s[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='*')
            a[i+1][j+1]=1;
            else
            a[i+1][j+1]=0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==1)
            cout<<"*";
            else
            cout<<a[i+1][j]+a[i+1][j+1]+a[i+1][j-1]+a[i][j+1]+a[i][j-1]+a[i-1][j]+a[i-1][j+1]+a[i-1][j-1];

        }
        cout<<endl;
    }
}
int main()
{
    //init();
    int _ = 1;
    //scanf("%d", &_);
    while (_--)
    {
        solve();
    }
    return 0;
}

E.幼稚园的树

  • 知识点:模拟
  • 难度:中等
  • 题解:对于每棵树,模拟其增长即可,也可以通过纸上计算直接解答出来,但因为题目说n+m最大为3000,即使复杂度取最大也只有1500*1500=250000,远小于计算机一秒运行的大约10的八次方次运算,所以直接模拟即可。这里只给了模拟的方法,纸上计算就自行取算一下吧。
  • 代码:
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
vector<int> a;
void solve()
{
	int n;
	cin >> n;
	while (n--)
	{
		int x;
		cin >> x;
		a.push_back(x);
	}
	int x, k, y, m;
	cin >> x >> k >> y >> m;
	for (int i = 0; i < a.size(); i++)
	{
		for (int j = 0; j < m-1; j++)
		{
			a[i] += x;
			if (a[i] > k)
				a[i] = y;
		}
		cout << a[i] << " ";
	}
    cout<<endl;
    a.clear();
}
int main()
{
	// init();
	int _ = 1;
	scanf("%d", &_);
	while (_--)
	{
		solve();
	}
	return 0;
}

F.选卡片

  • 知识点:博弈,图论、DFS搜索
  • 难度:中等
  • 题解:对于此题,可以初始化一个二维的vector,然后每一个下标后面跟的数就是其约数或者其2倍的数,然后对其进行搜索,如果这个数还有剩余说明其可以取,最后找出那个自己可以必然获胜的取的点。
  • 代码:
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> choice;
vector <int> table[105];
int a[105], num[105], n, f = 0, ans;
int dfs(int choose)
{
	int i, new_choose, t;
	//if(sn == 0)可以去掉了,因为如果当前的choose已经没有可以选择的约数了,下边这个循环是不会进行的,也会走到返回-1那一步 
	  //  return -1;
	for(i = table[choose].size() - 1 ; i >= 0 ; i--)
	{
		new_choose = table[choose][i];
		if(num[new_choose])
		{
			num[new_choose]--;
			t = dfs(new_choose);
			num[new_choose]++;
			if(t == -1)
			    return 1;
		}
	} 
	return -1;
}
int main()
{
	char c;
	int i = 0, j, sum = 0, x, new_choose, t;
	while(1)
	{
		scanf("%d", &x);
		num[x]++;//出现次数 
		i++;
		c = getchar();
		if(c == '\n')
		    break;
	}
	while(1)
	{
		scanf("%d", &x);
		sum++;
		choice.push_back(x);
		c = getchar();
		if(c == '\n')
		    break;
	}
	sort(choice.begin(), choice.end());
	for(i = 1 ; i < 101 ; i++)//把每个数的约数和2倍数都事先存下来,要注意这里是倒序的 
	{
		if(num[i])
		{
			for(j = 1 ; j < 101 ; j++)
			{
				if(num[j] && (i % j == 0 || (j % i == 0&&j/i==2)))
				    table[i].push_back(j);
			}
		}
	}
	for(i = 0 ; i < choice.size() ; i++)
	{
		new_choose = choice[i];
		num[new_choose]--;
		t = dfs(new_choose);
		num[new_choose]++;
		if(t == -1)
		{
			printf("%d\n", new_choose);
			return 0;
		}
	}
	printf("-1\n");
	return 0;
}

G.奥运排序

  • 知识点:排序,模拟
  • 难度:中等
  • 题解:对于此题,可以创建四个数组,存四项需要排序的数据,然后排序四次即可,然后找出对每个国家最小的那一个输出即可
  • 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() 
{
	int n,m;
	while(cin>>n>>m)
	{
		vector<double> a, b, c, d,v[4];
		for (int i = 0; i < n;i++)
		{
			double x, y, z;
			cin >> x >> y >> z;
			v[0].push_back(x);
			v[1].push_back(y);
			v[2].push_back(x / z);
			v[3].push_back(y / z);
			a.push_back(v[0][i]);
			b.push_back(v[1][i]);
			c.push_back(v[2][i]);
			d.push_back(v[3][i]);
		}
		sort(a.begin(), a.end(), greater<double>());
		sort(b.begin(), b.end(), greater<double>());
		sort(c.begin(), c.end(), greater<double>());
		sort(d.begin(), d.end(), greater<double>());
		for (int i = 0; i < m;i++)
		{
			int x;
			cin >> x;
			for (int j = 0; j < n;j++)
			{
				if(v[0][x]==a[j])
				{
					cout << j + 1 << ":" << 1 << endl;
					break;
				}
				if(v[1][x]==b[j])
				{
					cout << j + 1 << ":" << 2 << endl;
					break;
				}
				if(v[2][x]==c[j])
				{
					cout << j + 1 << ":" << 3 << endl;
					break;
				}
				if(v[3][x]==a[j])
				{
					cout << j + 1 << ":" << 4 << endl;
					break;
				}
			}
		}
		v[0].clear();
		v[1].clear();
		v[2].clear();
		v[3].clear();
		a.clear();
		b.clear();
		c.clear();
		d.clear();
		cout << endl;
	}
}

H.旭妹的大小数

  • 知识点:选择结构
  • 难度:简单
  • 题解:对判断两个数字,输出大的即可
  • 代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    int a, b;
    cin >> a >> b;
    int c = (a > b) ? a : b;
    cout << c;
}

I.集训队选拔

  • 知识点:选择结构
  • 难度:简单
  • 题解:对数组进行排序,然后从大到小输出n项即可。
  • 代码:
#include <bits/stdc++.h>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n, m;
    cin >> m >> n;
    ll x;
    vector<ll> v;
    for (int i = 0; i < m; i++)
    {
        cin >> x;
        v.push_back(x);
    }
    sort(v.begin(), v.end());
    for (int i = v.size() - 1; i >= m - n;i--)
        cout << v[i] << " ";
        return 0;
}using namespace std;
#define ll long long
int main()
{
    int a, b;
    cin >> a >> b;
    int c = (a > b) ? a : b;
    cout << c;
}

J.字符串处理

  • 知识点:字符串
  • 难度:简单
  • 题解:将其中字母找出改为大写即可
  • 代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    for (int i = 0; i < s.length();i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
            cout << s[i];
        if(s[i]>='a'&&s[i]<='z')
            cout << char(s[i] - 32);
    }
}

总结

这套题没有特别难的题目,大部分都是基础题和排序题,只有一个有关搜索的题目,其他都为较简单的题目。

全部评论

相关推荐

星辰再现:裁员给校招生腾地方
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务