[关闭]
@wwwqeqeqeqe 2017-04-11T22:02:20.000000Z 字数 1939 阅读 937

周末训练


A(lightOJ 1022)

题目大意

给你一个正方形和一个正方形内接圆,告诉你圆的半径,求出指定阴影范围的面积大小。

解题思路

由于已知圆的半径,直接算出圆和正方形的面积,然后相减,就可得出答案。

AC代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const double pi=2*acos(0.0);
  8. int T,casee;
  9. double r;
  10. int main()
  11. {
  12. casee=0;
  13. scanf("%d",&T);
  14. while(T--)
  15. {
  16. scanf("%lf",&r);
  17. double s=r*r*2*2;
  18. double m=pi*r*r;
  19. double ans=s-m;
  20. printf("Case %d: %.2lf\n",++casee,ans);
  21. }
  22. return 0;
  23. }

B(lightOJ 1023)

题目大意

给你两个数N和K,让你输出N个字母的K次全排列。

解题思路

直接使用STL函数输出全排列字符串就行了。

AC代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. int T,n,k;
  8. char a[30];
  9. int main()
  10. {
  11. int casee=0;
  12. scanf("%d",&T);
  13. while(T--)
  14. {
  15. scanf("%d%d",&n,&k);
  16. if(n<5)
  17. {
  18. int p=1;
  19. for(int i=1; i<=n; i++)
  20. p*=i;
  21. k=min(k,p);
  22. }
  23. for(int i=0; i<n; i++)
  24. {
  25. a[i]=i+'A';
  26. }
  27. printf("Case %d:\n",++casee);
  28. do
  29. {
  30. for(int i=0; i<n; i++)
  31. printf("%c",a[i]);
  32. printf("\n");
  33. k--;
  34. }
  35. while(next_permutation(a,a+n)&&k);
  36. }
  37. return 0;
  38. }

C (lightOJ 1024)
题目大意

给你一个n,然后求这n个数的最小公倍数,每个数的大小为1~1e4。

解题思路

因为数字太多,每个数字也不小,所以如果直接求最小公倍数的话会炸long long,因此需要一种高精度的计算方式。通过观察可以知道,这些数的最小公倍数是他们的质因数以最大出现次数为幂的乘积。
例如样例2:
    4
    5 6 30 60
    5 : 5 
    6 : 2*3
    30 : 2*3*5
    60 : 2^2*3*5
所以最小公倍数为2^2*3*5(因为2出现次数最多为两次,其他两个为一次)

AC代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int maxn=1e6+5;
  8. int n,T,num,k=0;
  9. int cnt[maxn],ans[maxn];
  10. int f(int x)
  11. {
  12. int mark=0;
  13. for(int i=2; i<=sqrt(x); i++)
  14. {
  15. mark=0;
  16. while(x%i==0)
  17. {
  18. mark++;
  19. x/=i;
  20. }
  21. cnt[i]=max(cnt[i],mark);
  22. }
  23. if(x>1)
  24. cnt[x]=max(cnt[x],1);
  25. }
  26. void Mul(int a[], int t)
  27. {
  28. for(int i=0; i<1000; i++)
  29. a[i] = a[i]*t;
  30. for(int i=0; i<1000; i++)
  31. {
  32. a[i+1] += a[i]/10000;
  33. a[i] = a[i]%10000;
  34. }
  35. }
  36. void put(int a[])
  37. {
  38. int i=1000;
  39. while(i>=0 && a[i]==0)
  40. i--;
  41. printf("%d", a[i--]);
  42. while(i>=0)
  43. printf("%04d", a[i--]);
  44. printf("\n");
  45. }
  46. int main()
  47. {
  48. int casee=0;
  49. scanf("%d", &T);
  50. while(T--)
  51. {
  52. memset(cnt, 0, sizeof(cnt));
  53. memset(ans, 0, sizeof(ans));
  54. scanf("%d", &n);
  55. for(int i=0; i<n; i++)
  56. {
  57. scanf("%d", &num);
  58. f(num);
  59. }
  60. ans[0] = 1;
  61. for(int i=0; i<=10000; i++)
  62. {
  63. if(!cnt[i])
  64. continue;
  65. int t = 1;
  66. for(int j=0; j<cnt[i]; j++)
  67. t *= i;
  68. Mul(ans, t);
  69. }
  70. printf("Case %d: ", ++casee);
  71. put(ans);
  72. }
  73. return 0;
  74. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注