BestCoder Round #47

1001 Senior's Array

题目链接:1001

题意:给你一个长度为n的序列,你必须修改序列中的某个数为P,求修改后的最大连续子序列和。

思路:数据量比较小,可以直接暴力做, 枚举序列的每个数修改成P,然后更新最大子序列和。

code:

 1 #include <iostream>

 2 #include <algorithm>

 3 using namespace std;

 4 const int MAXN = 1005;

 5 typedef long long LL;

 6 int a[MAXN];

 7 

 8 LL getSum(int a[], int n)

 9 {

10     LL maxSum = 0, tmpSum = 0;

11     int maxNum = -1000000001;

12     for (int i = 0; i < n; ++i)

13     {

14         tmpSum += a[i];

15         if (maxSum < tmpSum)

16             maxSum = tmpSum;

17         else if (tmpSum < 0)

18             tmpSum = 0;

19         maxNum = max(maxNum, a[i]);

20     }

21     if (maxSum == 0) return (LL)maxNum;

22     return maxSum;

23 }

24 

25 int main()

26 {

27     int nCase;

28     cin >> nCase;

29     while (nCase--)

30     {

31         int n, P;

32         cin >> n >> P;

33         for (int i = 0; i < n; ++i)

34             cin >> a[i];

35         LL ans = -1000000001;

36         for (int i = 0; i < n; ++i)

37         {

38             int t = a[i];

39             a[i] = P;

40             ans = max(ans, getSum(a, n));

41             a[i] = t;

42         }

43         cout << ans << endl;

44     }

45     return 0;

46 }

1002 Senior's Gun

题目链接:1002

题意:有n把枪每把枪都有一定的攻击值,有m个怪兽每个怪兽都有一定的防御值,当攻击值大于防御值时才能击杀怪兽并获得他们差值的酬劳,求最大酬劳。

思路:容易发现最后的方案一定是攻击力最强的k把枪消灭了防御力最弱的k只怪物。

code:

 1 #include <iostream>

 2 #include <algorithm>

 3 using namespace std;

 4 const int MAXN = 100005;

 5 typedef long long LL;

 6 int a[MAXN];

 7 int b[MAXN];

 8 

 9 bool cmp(int x, int y)

10 {

11     return x > y;

12 }

13 

14 int main()

15 {

16     int nCase;

17     cin >> nCase;

18     while (nCase--)

19     {

20         int n, m;

21         cin >> n >> m;

22         for (int i = 0; i < n; ++i)

23             cin >> a[i];

24         for (int i = 0; i < m; ++i)

25             cin >> b[i];

26         sort(a, a + n, cmp);

27         sort(b, b + m);

28         LL ans = 0;

29         int p = 0, q = 0;

30         while (p < n && q < m)

31         {

32             if (a[p] > b[q])

33             {

34                 ans += a[p] - b[q];

35                 ++p;

36                 ++q;

37             }

38             else break;

39         }

40         cout << ans << endl;

41     }

42     return 0;

43 }

 

你可能感兴趣的:(round)