当前位置:   article > 正文

2021HAUT_新生周赛lcx专场(三)_洛谷新生周赛

洛谷新生周赛

题目异常友好。 

有不懂的,直接留言。


目录

卷王之争

纸牌游戏

签到时间

干饭时间

游戏时间

周赛榜单

没有名字

三角图形


卷王之争

比较两个分数大小;

法一:直接通分时要注意数据范围。

  1. #include <iostream>
  2. int main()
  3. {
  4. long long a , b , x , y ;
  5. scanf("%d%d%d%d",&a,&b,&x,&y) ;
  6. a*= y ;
  7. x*= b ;
  8. if(a > x)
  9. printf("H is juanwang!\n") ;
  10. else if(a < x)
  11. printf("T is juanwang!\n") ;
  12. else
  13. printf("We are juanwang!\n") ;
  14. return 0;
  15. }

法二:除法计算注意,double不能直接判等号。 

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #define double long double
  5. const double eps = 1e-20 ;
  6. int dcmp(double x,double y){
  7. if(fabs(x - y ) < eps) return 0 ;
  8. if(x < y) return -1;
  9. return 1 ;
  10. }
  11. int main()
  12. {
  13. double a, b , x , y ;
  14. scanf("%d%d%d%d" ,&a ,&b ,&x ,&y) ;
  15. double s = a/b ;
  16. double u = x/y ;
  17. if(dcmp(s,u) > 0)
  18. printf("H is juanwang!\n") ;
  19. else if(dcmp(s,u) < 0)
  20. printf("T is juanwang!\n") ;
  21. else
  22. printf("We are juanwang!\n") ;
  23. return 0 ;
  24. }

纸牌游戏

算是一个简单博弈吧;

例有两种花色的纸牌:

新生第一次取走了第一种纸牌m张,则S学长取走另一种花色m张;

此后不管新生取走哪一种花色的纸牌,也不论取走多少张,S学长都会取走另一种花色的纸牌同样多张;

这样,最后一张纸牌一定是S学长取走的。

拓展到四种花色,也是同样道理。

这样的话,无论如何,结果都是S学长必胜。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n ;
  5. scanf("%d",&n) ;
  6. printf("tql\n") ;
  7. return 0;
  8. }

签到时间

这是一道简单的高中数学题;

已知:二项式展开式的系数,奇数项之和等于偶数项之和。

选偶数个人,是:C_{n}^{2}+C_{n}^{4}+C_{n}^{6}+C_{n}^{8} ...

选奇数个人,是:C_{n}^{1}+C_{n}^{3}+C_{n}^{5}+C_{n}^{7}...

 则结果为:\left \{ C_{n}^{2}+C_{n}^{4}+C_{n}^{6}+C_{n}^{8}... \right \}-\left \{ C_{n}^{1}+C_{n}^{3}+C_{n}^{5}+C_{n}^{7}... \right \}

二项式展开式得偶数项多一个C_{n}^{0} = 1 ;

则最后结果为-1 ;

如果,想不起来这个定理的话,建议写几个试试,找规律。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n ;
  5. scanf("%d",&n) ;
  6. printf("-1\n") ;
  7. return 0;
  8. }

干饭时间

简单贪心;

每次只能去买两种东西,必须在第一种东西做好之前回来;

则,每次选取得两个数字不能相等;

最终结果等于每次选择的两个数字的最大值再加和;

为了最后的时间加和最小,则需要让每两个时间中最小的那个时间值,尽可能的大;

做法:先排序,每次选择两个不同的数,消耗的时间为较大的那个数值;

  1. #include <iostream>
  2. #include <cstdio>
  3. int a[1010], b[1010];
  4. void Sort(int a[], int n)
  5. {
  6. for (int i = n - 1; i > 0; i--)
  7. for (int j = 0; j < i; j++)
  8. if (a[j] > a[j + 1])
  9. {
  10. int t = a[j];
  11. a[j] = a[j + 1];
  12. a[j + 1] = t;
  13. }
  14. }
  15. int main()
  16. {
  17. int n;
  18. scanf("%d", &n);
  19. for (int i = 0; i < n; i++)
  20. scanf("%d", &a[i]);
  21. Sort(a , n);
  22. int ans = 0;
  23. for (int i = n - 1; i >= 0; i--)
  24. {
  25. if (b[i])
  26. continue;
  27. ans += a[i];
  28. for (int j = i - 1; j >= 0; j--)
  29. {
  30. if (!b[j] && a[j] < a[i])
  31. {
  32. b[j] = 1;
  33. break;
  34. }
  35. }
  36. }
  37. printf("%d\n", ans);
  38. return 0;
  39. }

游戏时间

本场最签到题;

每次循环当没有达到目标的话,天数加加,分数增长值加加。

  1. #include <iostream>
  2. #include <cstdio>
  3. int main()
  4. {
  5. int n , k ;
  6. scanf("%d%d",&n,&k) ;
  7. int ans = 0 ;
  8. int day = 0 ;
  9. while(ans < n)
  10. ans += k , k++ , day ++ ;
  11. printf("%d\n" , day) ;
  12. return 0 ;
  13. }

周赛榜单

如果对每个t都过一遍1~n的话,时间复杂度达到了1e12,这样的话时间超限,所以这个题得要先处理一下。

SO,这个只要把前缀和处理一下,这个题就变成了签到题。

例:

原数组: a[1] ,a[2],a[3],a[4],a[5],...,a[n]
前缀和 s[i]为数组的前i项和
前缀和: s[i]=a[1]+a[2]+a[3]+...+a[i1]+a[i]

前缀和算法能够快速的求出某段区间的和;

出题人说:前缀和更深度的学习看这里

  1. #include <stdio.h>
  2. int a[1000010] ;
  3. int main()
  4. {
  5. int n ;
  6. scanf("%d" , &n) ;
  7. a[0] = 0 ;
  8. for(int i = 1 ;i <= n ; i++)
  9. {
  10. int x ;
  11. scanf("%d" , &x) ;
  12. a[i] = a[i-1]+x ;//a[i]表示前i个人的分数的和
  13. }
  14. int t ;
  15. scanf("%d" , &t) ;
  16. while(t--)
  17. {
  18. int x ;
  19. scanf("%d" , &x) ;
  20. printf("%d\n" , a[x]) ;
  21. }
  22. return 0 ;
  23. }

没有名字

简单分支;

依照题意可得,如下:

  1. #include <iostream>
  2. #include <cstdio>
  3. int a[1000010] ;
  4. int main()
  5. {
  6. int n;
  7. scanf("%d" ,&n) ;
  8. int ans = 0 , sum = 0 ;
  9. while(n--)
  10. {
  11. int x , y ;
  12. scanf("%d%d",&x,&y) ;
  13. if(x > y)
  14. {
  15. if(x==40 && (y==10 || y==20))
  16. sum += 5 ;
  17. else
  18. ans += (x-y) ;
  19. }
  20. else
  21. {
  22. if(y==40 && (x==10 || x==20))
  23. ans += 5 ;
  24. else
  25. sum += (y-x) ;
  26. }
  27. }
  28. printf("%d %d",ans ,sum) ;
  29. return 0 ;
  30. }

三角图形

简单模拟;

六根棍子拼出两个三角形。

法一:枚举,枚举每种可能拼成三角形的情况,判断即可;

  1. #include <iostream>
  2. #include <cstdio>
  3. int is_right(int a , int b , int c)
  4. {
  5. if(c+b > a)
  6. return 1 ;
  7. return 0 ;
  8. }
  9. int main()
  10. {
  11. int a[10] ;
  12. for(int i = 0 ; i < 6 ; i++)
  13. scanf("%d", &a[i]) ;
  14. int flag = 0 ;
  15. for(int i = 0 ; i < 6 ; i++)
  16. for(int j = i+1 ; j < 6 ; j++)
  17. for(int k = j+1 ; k < 6 ; k++)
  18. {
  19. int b[5] ;
  20. int c = 0 ;
  21. for(int p = 0 ; p < 6 ; p++)
  22. if(p != i && p != j && p != k)
  23. b[c++] = a[p] ;
  24. if(is_right(a[i] , a[j] , a[k])==1 && is_right(b[0] , b[1] , b[2])==1)
  25. {
  26. flag = 1 ;
  27. break ;
  28. }
  29. }
  30. if(flag == 0)
  31. printf("No\n") ;
  32. else
  33. printf("Yes\n") ;
  34. return 0 ;
  35. }

法二:也是枚举

  1. #include <iostream>
  2. #include <cstdio>
  3. int main()
  4. {
  5. int a[10] ;
  6. for(int i = 0 ; i < 6 ; i++)
  7. scanf("%d", &a[i]) ;
  8. if(a[5] + a[4] > a[3] && a[2] + a[1] > a[0])
  9. printf("Yes\n") ;
  10. else if(a[5] + a[3] > a[2] && a[4] + a[1] > a[0])
  11. printf("Yes\n") ;
  12. else if(a[5] + a[2] > a[1] && a[4] + a[3] > a[0])
  13. printf("Yes\n") ;
  14. else if(a[5] + a[1] > a[0] && a[4] + a[3] > a[2])
  15. printf("Yes\n") ;
  16. else
  17. printf("No\n") ;
  18. return 0 ;
  19. }

题解简陋,有问题直接提;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/884178
推荐阅读
相关标签
  

闽ICP备14008679号