第一题空间,考的是对MB.KB.byte.bit的转换
1mb = 1024 kb
1kb = 1024 byte
1byte = 8bit
直接算就能出了
第二题卡片,理解错题意了....没过
感觉没啥参考意义,不说了
int n;cin >>n;
for(int i = 1;;i++){
n -= i;
ans++;
if(n <= 0) break;
}
cout << ans;
第三题直线
问在一个平面坐标系给定一片区域,通过两点连成一线,判断能连成多少个不同的线。
判断线是否唯一可以看斜率(y2-y1)/(x2-x1)和截距b=kx-y
把答案存入set中,自动去重,最后直接输出答案即可
#include <bits/stdc++.h>
using namespace std;
int main(){
set<pair<double,double>> s;
for(int x1 = 0; x1 < 20;x1++){
for(int y1 = 0;y1 < 21;y1++){
for(int x2 = x1+1;x2 < 20;x2++){//x不能重复
for(int y2 = 0;y2 < 21;y2++){
double k = (double)(y2-y1)/(x2-x1);
double b = (double) (y1*x2-y2*x1)/(x2-x1);
// double b = (double) (y1-(y2-y1)/(x2/x1)*x1);//这么算误差太大了,可以化简成上面的式子
s.insert({k,b});
}
}
}
}
cout << s.size() + 20;//因为x不能重复,所以垂直的线都未考虑,这里直接加上20个垂直的线就是正解
第四题货物摆放
给定一个数n,通过A * B * C任意组合相乘得到n记作一个可能,输出所有可能
这道题n给的很大,直接三重for循环肯定求不出来
可以先将n的因数分解出来,遍历所有n的因数(只需要遍历两层即可,第三层用n%前两层的乘积可以加快速度)
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
// 找出 n 的所有因数
vector<ll> findFactors(ll n) {
vector<ll> factors;
for (ll i = 1; i <= sqrt(n); ++i) {
if (n % i == 0) {
factors.push_back(i);
if (i != n / i) { //把大于根号n的也算上了
factors.push_back(n / i);
}
}
}
return factors;
}
int main() {
ll n = 2021041820210418;
vector<ll> factors = findFactors(n);
ll ans = 0;
int factorCount = factors.size();
// 遍历所有因数组合
for (int i = 0; i < factorCount; ++i) {
for (int j = 0; j < factorCount; ++j) {
ll temp = factors[i] * factors[j];
if (n % temp == 0) {
ans++;
}
}
}
cout << ans << endl;
return 0;
}
第五题pass
第六题时间显示,毫秒转时分秒的题。直接求就行,这道题输出格式错了只拿了80%
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin >> n;
n /= 1000;
int t = n / (60*60*24);
n -= t * (60*60*24);
int h = n / (60*60) % 24;
n -= (h*60*60);
int m = n / (60);
int s = n % (60);
printf("%02d:%02d:%02d",h,m,s);//这样可以自动加前导0
}
第七题砝码称重,好题。
三个模版都能做出来(有一个拿不了满分)
线性dp、set、dfs
//正解1,set存答案,每次输入时,存入新增的答案
#include <bits/stdc++.h>
using namespace std;
int main(){
set<int> s={0};
int n,m,i;
cin >> n;
for(i=0;i<n;++i){
cin >> m;
vector<int> v(s.begin(),s.end());
for(int &e:v){
s.insert(e+m);//因为s中有一个元素是0,所以这里也包括了单走一个m
s.insert(abs(e-m));
}
}
cout << s.size() - 1 ;
return 0;
}
//正解2,线性dp f[i][j]分别表示放到第i个能否称j重量的物品,0不能1能
//1)不选当前砝码,那么能否凑出重量j,和选择前i-1个物品,是否能凑出重量j的状态相同
//2)选择当前砝码w,假设放到左边重量是+,当前的总重量是j,那么选择此砝码之前的重量是j-w[i],
//如果前一个状态能够凑出j-w[i],选择了当前砝码放到左边后,此状态必然能凑出重量j,
//所以f(i, j) |= f(i - 1, j - w[i]);
//3)同理,选择当前砝码放到右边:f(i, j) |= f(i - 1, j + w[i]);
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int f[110][N];
int n,m;
int w[110];
int main(){
cin >> n;
for(int i = 1;i <= n;i++) cin >> w[i] , m += w[i];
f[0][0] = 1;
for(int i = 1;i <= n;i++){
for(int j = 0;j <= m;j++){
f[i][j] = f[i - 1][j] + f[i - 1][abs(j - w[i])] + f[i - 1][j + w[i]];
}
}
int ans = 0;
for(int i = 1;i <= m;i++){
if(f[n][i]) ans++;
}
cout << ans;
}
//dfs 50%
#include <bits/stdc++.h>
using namespace std;
set<int> ans;
const int N = 110;
int a[N];
int n;
void dfs(int u,int res){
if(u == n){
if(res > 0){
ans.insert(res);
}
return;
}
dfs(u+1,res);
dfs(u+1,res+a[u]);
dfs(u+1,res-a[u]);
}
int main(){
cin >> n;
for(int i = 0;i < n;i++){
cin >> a[i];
}
dfs(0,0);
cout << ans.size();
}
第八题杨慧三角,数论不会,拿了个20%样例分
第九题线段树,暴力打了60%
//错解,直接sort 60%
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main(){
int n ,m;
cin >> n >> m;
for(int i = 1;i <= n;i++){
a[i] = i;
}
while(m--){
int p,q;
cin >> p >> q;
if(p == 1){
//升序排序
sort(a+q,a+n+1,[](int a,int b){
return a < b;
});
}else if(p == 0){
//降序排序
sort(a+1,a+q+1,[](int a,int b){
return a > b;
});
}
}
for(int i = 1;i <= n;i++){
cout << a[i] <<" ";
}
}