[关闭]
@liutianyue520 2016-12-09T10:06:55.000000Z 字数 950 阅读 632

第一次作业

题解


【题目】[1]

A Design Tutorial: Learn from Math

题目大意:

    给定一个数n(12<=n<=10^6),求出符合以下要求的x和y:
    1.x+y=n
    2.x和y都是合数

解题思路:

    显然,若n为偶数,可以表示为两个偶数相加;若n为奇数,可以表示为一个奇数加一个偶数。而大于2的所有偶数都是合数,最小的偶合数为4,最小的奇合数为9。所以大于等于12的偶数可以表示为4+(n-4),大于12的奇数可以表示为9+(n-9)。
    时间复杂度O(1),空间复杂度O(1)。

AC代码:

  1. #include <stdio.h>
  2. int panduan(int x)
  3. {
  4. for(int i=2;i*i<=x;i++)
  5. if(x%i==0)
  6. return 1;
  7. return 0;
  8. }
  9. int main()
  10. {
  11. int n,i;
  12. while(scanf("%d",&n)!=EOF)
  13. {
  14. for(i=4;i<=n/2;i++)
  15. {
  16. if(panduan(i)&&panduan(n-i))
  17. {
  18. printf("%d %d\n",i,n-i);
  19. break;
  20. }
  21. }
  22. }
  23. return 0;
  24. }

【题目】【2】

**B - Design Tutorial: Learn from Life **

题目大意:

   有一个电梯,每一个人都想乘电梯到达自己想要到达的楼层!从a层到b层的时间是|a-b|,乘客上下电梯的时间忽略不计,问至少需要多少时间?

解题思路:

  这个使用的是贪心的思想,首先对所有人要到的楼层进行一次从大到小排序,然后开始吧n%k个人放到他们要到的楼层。然后将k-(n%k)个人带到啊【n%k】层,然后再下来接人,重复此操作,然后将所有人都送到他们想到的楼层。

AC代码:

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. int a[2008];
  6. int main()
  7. {
  8. int n,i,k;
  9. while(scanf("%d%d",&n,&k)!=EOF)
  10. {
  11. for(i=0;i<n;i++)
  12. {
  13. scanf("%d",&a[i]);
  14. }
  15. sort(a,a+n);
  16. int sum=0;
  17. for(i=n-1;i>=0;i-=k)
  18. {
  19. sum+=2*(a[i]-1);
  20. }
  21. printf("%d\n",sum);
  22. }
  23. return 0;
  24. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注