Codeforces MemSQL.Round.1

A - Declined Finalists

题目大意:

  有1e6个人,序号从1到1e6,现在要邀请前25个人组成队伍,但是被选中的人可能会推掉邀请,如果有人没去,就要从第26个人开始按序号补满25个队员。你现在已知有K个人的序号,求出最少有多少个人推掉了邀请。

  输入一行一个整数:代表已知的K个人(最多25人)。

  输入一行K 个整数:代表已知K个人的序号。

  输出一行一个整数:代表最少有多少人推掉了邀请。

  样例输入:25

       2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 28

       5

       16 23 8 15 4

       3

       14 15 92

  样例输出:3  

       0  

       67

解题思路:

  此题题干较为不好理解,但是思路很简单:sort后看最大数。

  如果大于25,结果就是最大数和25的差。

  小于等于25,结果均为0。

A C 代码:

 1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner sc = new Scanner(System.in);
 6         while(sc.hasNext()){
 7             int n = sc.nextInt();
 8             int m[] = new int[n];
 9             for(int i = 0;i < n;i ++){
10                 m[i] = sc.nextInt();
11             }
12             Arrays.sort(m);
13             if(m[n - 1] > 25){System.out.println(m[n - 1] - 25);}
14             else{System.out.println("0");}
15         }
16     }
17 }
View Code

B - Lazy Security Guard

题目大意:

  求解n个边长为单位长度的正方形拼成的图形的最短周长。

  输入一行一个整数:n,代表给你n个小正方形。

  输出一行一个整数:代表得出的最小周长。

解题思路:

  一个简单的公式,2 * ((ceil)(2 * sqrt(n)))。

  或者,(ceil)(4 * sqrt(n)) 然后判断,奇数加一,偶数不变。

A C 代码:

 1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner sc = new Scanner(System.in);
 6         while(sc.hasNext()){
 7             int n = sc.nextInt();
 8             double p = 2 * Math.sqrt(n);
 9             int pp = (int)Math.ceil(p);
10             System.out.println(2 * pp);
11         }
12     }
13 }
View Code

  C - Pie Rules

题目大意:

  两个人(A和B)按照以下规则分n堆糖,两个人都按照最优策略。

  从B开始,如果B拿走当前堆的糖,那么下一堆轮到A选择要不要。

  如果B不要这堆糖,那么就将这堆糖给A,自己继续选择下一堆要不要。

  直到所有的糖都分完。求解两人各获得多少糖。

  输入一行一个整数:N,代表N堆糖果(N ∈ [1,50])。

  输出一行N 个整数:每个整数代表一堆糖的数量。从头到尾按顺序分糖。

  输出一行两个整数:分别代表A和B获得了多少糖。

  样例输入:3         5

       141 592 653    10 21 10 21 10

  样例输出:653 733      31 41

解题思路:

  一道DP题目。dp[i]代表分到当前堆时,当前持有分配权的人最多能得到多少苹果。sum[i]代表当前堆时一共分配了多少苹果。

  最开始一直正向分配,始终出现错误。。。

  然后才知道应该反向去分配。。。

  因为正向分配的时候,并不知道谁持有分配权。

A C 代码:

 

 1 import java.util.*;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner sc = new Scanner(System.in);
 6         while(sc.hasNext()){
 7             int n = sc.nextInt();
 8             int pie[] = new int[n + 1];
 9             int dp[] = new int[n + 1];
10             int sum[] = new int[n + 1];
11             for(int i = n;i >= 1;i --){
12                 pie[i] = sc.nextInt();
13             }
14             for(int i = 1;i <= n;i ++){
15                 sum[i] = sum[i - 1] + pie[i];
16             }
17             /*
18             System.out.print("sum[] = ");
19             for(int i = 1;i <= n;i ++){
20                 System.out.print(sum[i] + " ");
21             }System.out.println();
22             */
23             for(int i = 1;i <= n;i ++){
24                 dp[i] = Math.max(dp[i - 1],sum[i] - dp[i - 1]);
25             }
26             /*
27             System.out.print("dp[] = ");
28             for(int i = 1;i <= n;i ++){
29                 System.out.print(dp[i] + " ");
30             }System.out.println();
31             */
32             System.out.println((sum[n] - dp[n]) + " " + dp[n]);
33         }
34     }
35 }
View Code

 

 

 

转载于:https://www.cnblogs.com/love-fromAtoZ/p/7730775.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值