华北水利水电大学新生校赛热身赛
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);
}
}
总结
这套题没有特别难的题目,大部分都是基础题和排序题,只有一个有关搜索的题目,其他都为较简单的题目。