前言
介绍B组里面的部分题。
一、C题(直线)
解题思路:
利用循环枚举出每一个点, 然后利用点斜式判断直线是否唯一, 注意垂直与X轴的直线, 斜率不存在, 要在最后加上。
细节:在计算斜率,和截距时可能出现小数, 要用二者差值的绝对值是否大于1e-8,判断二者是否不相同。可以把计算出的斜率存储在一个数组中,然后排序后在判断。
代码:
#include <bits/stdc++.h>
using namespace std;
vector<pair<double, double>> v;
int main()
{
for(int i = 0; i < 20; i++)
{
for(int j = 0; j < 21; j++)
{
for(int k = 0; k < 20; k++)
{
for(int z = 0; z < 21; z++)
{ //找两个点
int x1 = i, y1 = j, x2 = k, y2 = z;
if(x1 != x2) //排除斜率为0;
{
double a = (double)(y2 - y1)/(x2 - x1);
double b = (double)(y2 - a * x2);
v.push_back({a,b});
}
}
}
}
}
int ans = 1; //在排序后,默认第一个元素不一样
sort(v.begin(), v.end()); //为了去重
for(int i = 1; i < v.size(); i++)
{
if(fabs(v[i].first - v[i - 1].first )> 1e-6 || fabs(v[i].second - v[i - 1].second) > 1e-6)
ans++;
}
ans += 20;
cout << ans << endl;
}
2.D货物
思路:
求出所有因子,用数组存储起来, 再写三个循环, 判断是否满足条件。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n = 2021041820210418;
//求所有因数
vector<ll> v;
for(ll i = 1; i * i <= n; i++)
{
if(n % i == 0)
{
v.push_back(i);
v.push_back(n/i);
}
}//组合因子
int cnt = 0;
for(ll i = 0; i <v.size(); i++)
{
for(ll j = 0; j <v.size(); j++)
{
for(ll k = 0; k < v.size(); k++)
{
if(v[i] * v[j] * v[k] == n)
cnt++;
}
}
}
cout << cnt << endl;
return 0;
}
3E路径
思路:
dp 动态规划:
有题知道: 1到22的路径长度是一定的, 那么1到23的min为{a[2] + length2,23 , a[3] + length3,23, ......., a[22] + length22,23}; 其中a[n]代表1到n的距离。一次类推, 得到答案。
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int gbs(int a, int b)
{
return (a * b) / __gcd(a,b);
}
int main()
{
int arr[2022] = {0};
//初始化数组
int i = 0, min = 0;
for(i = 0; i <= 22; i++)
{
arr[i] = i; //初始化1到22;
}
for(; i <= 2021; i++ )
{
//计算数组
int j = 21;
arr[i] = arr[i - j] + gbs(i - j, i);
//求出该下标的最小值
min = arr[i];
while(j>0)
{
if(min > arr[i - j] + gbs(i - j, i))
{
min = arr[i - j] + gbs(i - j, i);
}
j--;
}
}
cout << min << endl;
return 0;
}
砝码问题:
题目:
思路:利用set容器。自动去重。
代码 :
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int> s;
int N = 0, w = 0;
cin >> N;
for(int i = 0; i < N; i++)
{
cin >> w;
vector<int> v(s.begin(), s.end());
for(int j = 0; j < v.size(); j++ )
{
s.insert(v[j] + w);
if(abs(v[j] - w) != 0)
s.insert(abs(v[j] - w));
}
s.insert(w);
}
cout << s.size() << endl;
return 0;
}
总结:今天弄回dp, 加油!!!