• 每日小题打卡


    目录

    三元组排序

    数字排列 

    笨拙的手指

    查找

    砍树


     

    三元组排序

    给定 N 个三元组 (x,y,z),其中 x 是整数,y 是浮点数,z 是字符串。

    请你按照 x 从小到大的顺序将这些三元组打印出来。

    数据保证不同三元组的 x 值互不相同。

    输入格式

    第一行包含整数 N。

    接下来 N 行,每行包含一个整数 x,一个浮点数 y,一个字符串 z,表示一个三元组,三者之间用空格隔开。

    输出格式

    共 N 行,按照 x 从小到大的顺序,每行输出一个三元组。

    注意,所有输入和输出的浮点数 y 均保留两位小数。

    数据范围

    1≤N≤10000
    1≤x,y≤10^5
    字符串总长度不超过 10^5

    输入样例:

    1. 5
    2. 32 1.36 nsyiupnnhc
    3. 18 4.53 fmofzwrah
    4. 33 4.86 wzuymbm
    5. 1 3.93 gtnrwcebt
    6. 31 4.53 gcllxioc

    输出样例:

    1. 1 3.93 gtnrwcebt
    2. 18 4.53 fmofzwrah
    3. 31 4.53 gcllxioc
    4. 32 1.36 nsyiupnnhc
    5. 33 4.86 wzuymbm

    源代码

    简单的结构体排序 

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. struct S
    7. {
    8. int a;
    9. double b;
    10. string c;
    11. };
    12. int cmp(const struct S &A,const struct S &B)
    13. {
    14. if(A.a != B.a)return A.a < B.a;
    15. }
    16. int main()
    17. {
    18. vector A;
    19. int n;
    20. cin >> n;
    21. while(n -- )
    22. {
    23. S t;
    24. cin >> t.a >> t.b >> t.c;
    25. A.push_back(t);
    26. }
    27. sort(A.begin(),A.end(),cmp);
    28. for(int i = 0;i < A.size();i ++ )
    29. {
    30. cout << A[i].a << ' ' << setiosflags(ios::fixed) << setprecision(2) << A[i].b << ' ' << A[i].c << endl;
    31. }
    32. return 0;
    33. }

    数字排列 

    输入一组数字(可能包含重复数字),输出其所有的排列方式。

    数据范围

    输入数组长度 [0,6]。

    样例

    1. 输入:[1,2,3]
    2. 输出:
    3. [
    4. [1,2,3],
    5. [1,3,2],
    6. [2,1,3],
    7. [2,3,1],
    8. [3,1,2],
    9. [3,2,1]
    10. ]

    源代码 

    c++类的简单设计以及二维vector数组的使用 

    1. class Solution
    2. {
    3. public:
    4. vectorint>> permutation(vector<int>& nums)
    5. {
    6. sort(nums.begin(),nums.end());
    7. vectorint>> S;
    8. S.push_back(nums);
    9. while(next_permutation(nums.begin(),nums.end()))S.push_back(nums);
    10. return S;
    11. }
    12. };

    笨拙的手指

    奶牛贝茜正在学习如何在不同进制之间转换数字。

    但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。

    每当贝茜将数字转换为一个新的进制并写下结果时,她总是将其中的某一位数字写错。

    例如,如果她将数字 1414 转换为二进制数,那么正确的结果应为 1110,但她可能会写下 0110 或 1111。

    贝茜不会额外添加或删除数字,但是可能会由于写错数字的原因,写下包含前导 0 的数字。

    给定贝茜将数字 N 转换为二进制数字以及三进制数字的结果,请确定 N 的正确初始值(十进制表示)。

    输入格式

    第一行包含 N 的二进制表示,其中一位是错误的。

    第二行包含 N 的三进制表示,其中一位是错误的。

    输出格式

    输出正确的 N 的值。

    数据范围

    0≤N≤10^9,且存在唯一解。

    输入样例:

    1. 1010
    2. 212

    输出样例:

    14
    

    样例解释

    14 在二进制下的正确表示为 1110,在三进制下的正确表示为 112。

    源代码

    本题很简单只用三个函数即可解决

    第一个二进制转化为十进制的函数

    第二个二进制转化位三进制的函数(嵌套二进制转十进制)

    第三个判断情况的布尔函数

    观察题目我们若是使用暴力枚举的方法的话会超时,从暴力当中减少调整枚举方法从而减少枚举个数,避免TLE,若是对于三进制的字符串每位进行枚举的话则有除本位之外的两种情况,若是对于二进制的字符串进行每位枚举的话则只有除本位之外的一种情况,所以二进制字符串枚举处理较为容易,1010对于每位的情况取反的话只有四种情况:1110、1000、0010、1011(题目所给仅有一位出错),因此这四个字符串当中必定有一个正确,正确的字符串转化为三进制之后必定仅仅与只有一位错误的三进制字符串有一位不同

    因此我们对于二进制字符串的每位取情况相反的状况然后枚举,而后在枚举的二进制字符串转化为三进制的字符串当中找出与所给的三进制字符串有着仅一位不同的字符串ans即可,将ans串转化为十进制输出即可,时间复杂度控制在了O(n)

    1. #include
    2. #include
    3. using namespace std;
    4. int getans(string s)
    5. {
    6. int ans = 0;
    7. int w = 1;
    8. for(int i = s.size() - 1;i >= 0;i -- )
    9. {
    10. ans = ans + (s[i] - '0') * w;
    11. w = w * 2;
    12. }
    13. return ans;
    14. }
    15. string trans(string s)
    16. {
    17. int ans = getans(s);
    18. string t;
    19. while(ans > 0)
    20. {
    21. int num = ans % 3;
    22. t = t + char(num + '0');
    23. ans /= 3;
    24. }
    25. reverse(t.begin(),t.end());
    26. return t;
    27. }
    28. bool check(string a,string b)
    29. {
    30. int nums = 0;
    31. for(int i = 0;i < a.size() || i < b.size();i ++ )
    32. {
    33. if(a[i] != b[i])nums ++ ;
    34. if(nums > 1)break;
    35. }
    36. if(nums == 1)return true;
    37. else return false;
    38. }
    39. int main()
    40. {
    41. string a,b;
    42. cin >> a >> b;
    43. for(int i = 0;i < a.size();i ++ )
    44. {
    45. string t = a;
    46. if(t[i] == '0')t[i] = '1';
    47. else if(t[i] == '1')t[i] = '0';
    48. if(check(trans(t),b))
    49. {
    50. cout << getans(t) << endl;
    51. return 0;
    52. }
    53. }
    54. return 0;
    55. }

    查找

    题目描述

    输入 n(n≤10^6) 个不超过 10^9 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1​,a2​,…,an​,然后进行 m(m≤10^5) 次询问。对于每次询问,给出一个整数 q(q≤10^9),要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1 。

    输入格式

    第一行 2 个整数 n 和 m,表示数字个数和询问次数。

    第二行 n 个整数,表示这些待查询的数字。

    第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。

    输出格式

    m 个整数表示答案。

    输入输出样例

    输入 

    1. 11 3
    2. 1 3 3 3 5 7 9 11 13 15 15
    3. 1 3 6

    输出 

    1 2 -1 

    说明/提示

    10^6 规模的数据读入,请用 scanf。用 cin 会超时。

    源代码 

    标准的二分查找题目,不过我还是加了优化使用的cin和cout,也没有TLE

    1. #include
    2. using namespace std;
    3. const int N = 1000000 + 10;
    4. int a[N];
    5. int main()
    6. {
    7. ios::sync_with_stdio(false);
    8. cin.tie(0);
    9. int n,m;
    10. cin >> n >> m;
    11. for(int i = 0;i < n;i ++ )cin >> a[i];
    12. while(m -- )
    13. {
    14. int num;
    15. cin >> num;
    16. int l = 0,r = n - 1;
    17. while(l < r)
    18. {
    19. int mid = l + r >> 1;
    20. if(a[mid] >= num)r = mid;
    21. else l = mid + 1;
    22. }
    23. if(a[l] == num)cout << l + 1 << ' ';
    24. else cout << "-1" << ' ';
    25. }
    26. }

    砍树

    题目描述

    伐木工人 Mirko 需要砍 M 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。

    Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 H(米),伐木机升起一个巨大的锯片到高度 H,并锯掉所有树比 H 高的部分(当然,树木不高于 H 米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 20,15,10 和 17,Mirko 把锯片升到 15 米的高度,切割后树木剩下的高度将是 15,15,10 和 15,而 Mirko 将从第 1 棵树得到 5 米,从第 4 棵树得到 2 米,共得到 7 米木材。

    Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 H,使得他能得到的木材至少为 M 米。换句话说,如果再升高 1 米,他将得不到 M 米木材。

    输入格式

    第 1 行 2 个整数 N 和 M,N 表示树木的数量,M 表示需要的木材总长度。

    第 2 行 N 个整数表示每棵树的高度。

    输出格式

    1 个整数,表示锯片的最高高度。

    输入输出样例

    输入

    1. 4 7
    2. 20 15 10 17

    输出 

    15

    输入 

    1. 5 20
    2. 4 42 40 26 46

    输出 

    36

    说明/提示

    对于 100% 的测试数据,1≤N≤10^6,1≤M≤2×10^9,树的高度 <10^9,所有树的高度总和 M。

    源代码

    二分是简单但是注意数据范围,要开long long防止超出

    1. #include
    2. using namespace std;
    3. const int N = 1000000 + 10;
    4. typedef long long ll;
    5. ll a[N];
    6. int main()
    7. {
    8. ios::sync_with_stdio(false);
    9. cin.tie(0);
    10. ll n,m;
    11. cin >> n >> m;
    12. ll maxtree = 0;
    13. for(int i = 1;i <= n;i ++ )
    14. {
    15. cin >> a[i];
    16. maxtree = max(maxtree,a[i]);
    17. }
    18. ll l = 0,r = maxtree;
    19. while(l < r)
    20. {
    21. ll mid = l + r + 1 >> 1;
    22. ll sum = 0;
    23. for(int i = 1;i <= n;i ++ )
    24. {
    25. if(a[i] > mid)sum = sum + (a[i] - mid);
    26. }
    27. if(sum >= m)l = mid;
    28. else r = mid - 1;
    29. }
    30. cout << l;
    31. return 0;
    32. }

     

  • 相关阅读:
    Vuex入门
    pubsub-js在react中的使用
    PyTorch人脸识别
    使用 Rust 进行程序
    图文文案音视频素材库流量主小程序开发
    算法导论 ——分治中求解递归式的三种方法
    mysql的约束和表关系
    负载均衡、反向代理(8月26号)
    电脑系统安装后桌面图标隔开很宽怎么调?
    【部分】CCAA审核员-2022年7月OHSMS职业健康安全体系考试真题
  • 原文地址:https://blog.csdn.net/couchpotatoshy/article/details/126254339