Codeforces Round #260 (Div. 2) A~C

题目链接

A. Laptops

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

One day Dima and Alex had an argument about the price and quality of laptops. Dima thinks that the more expensive a laptop is, the better it is. Alex disagrees. Alex thinks that there are two laptops, such that the price of the first laptop is less (strictly smaller) than the price of the second laptop but the quality of the first laptop is higher (strictly greater) than the quality of the second laptop.

Please, check the guess of Alex. You are given descriptions of n laptops. Determine whether two described above laptops exist.

Input

The first line contains an integer n (1 ≤ n ≤ 105) — the number of laptops.

Next n lines contain two integers each, ai and bi (1 ≤ ai, bi ≤ n), where ai is the price of the i-th laptop, and bi is the number that represents the quality of the i-th laptop (the larger the number is, the higher is the quality).

All ai are distinct. All bi are distinct.

Output

If Alex is correct, print "Happy Alex", otherwise print "Poor Alex" (without the quotes).

Sample test(s)
input
2
1 2
2 1
output
Happy Alex

 

题意 : 给你n台笔记本的价格和质量,如果能找出一台电脑的价格比另一台的高可是质量却比他低就输出Happy Alex,否则输出Poor Alex。

思路 :将价格排序,然后找相邻的是否质量后边的大于前边那台的。这样做的道理是,价格排完序之后,如果存在不相邻的后者质量小于前者质量,那么中间必定有相邻的质量不符合前小于后。例如,价格3 4 5的电脑,如果5的质量比3的差,那么4的质量高于3时,说明4的质量高于5,4 5相邻。如果4的质量低于5的话,那么4的质量低于3,3 4 相邻。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <cmath>

 4 #include <iostream>

 5 #include <algorithm>

 6 

 7 using namespace std ;

 8 

 9 struct node

10 {

11     int price ;

12     int qua ;

13 }a[100010];

14 

15 int cmp(node x,node y)

16 {

17     return x.price < y.price ;

18 }

19 int main()

20 {

21     int n ;

22     scanf("%d",&n) ;

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

24     {

25         scanf("%d %d",&a[i].price,&a[i].qua) ;    }

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

27         int flag = 0 ;

28         for(int i = 0 ; i < n-1 ; i++)

29         {

30             if(a[i].qua > a[i+1].qua)

31             {

32                 flag = 1 ;

33                 break ;

34             }

35         }

36         if(flag)

37             puts("Happy Alex") ;

38         else puts("Poor Alex") ;

39     return 0 ;

40 }
View Code

 

 

B. Fedya and Maths

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

Fedya studies in a gymnasium. Fedya's maths hometask is to calculate the following expression:

(1n + 2n + 3n + 4nmod 5

for given value of n. Fedya managed to complete the task. Can you? Note that given number n can be extremely large (e.g. it can exceed any integer type of your programming language).

Input

The single line contains a single integer n (0 ≤ n ≤ 10105). The number doesn't contain any leading zeroes.

Output

Print the value of the expression without leading zeros.

Sample test(s)
input
4
output
4
input
124356983594583453458888889
output
0
Note

Operation x mod y means taking remainder after division x by y.

Note to the first sample:

 

题意 : 给你一个N,让你求(1n+2n+3n+4n)%5的值。

思路 : 1到9这9的数字的n次方都是有规律的,1无论几次方个位数一定是1,而2的几次方个位数则是6,2,4,8分别代表是n模4为0,则2n个位数是6,n模4为1,则个位数是2……,

3的与2一样的规律,分别是1 3 9 7,而4的规律则是6 4,只有两个,我们写成以下形式:

n%4 = 0    1 + 6 + 1 + 6  = 14 

n%4 = 1    1 + 2 + 3 + 4  =  10

n%4 = 2    1 + 4 + 9 + 6  =  20

n%4 = 3    1 + 8 + 7 + 4  =  20

由此可见,只有在n%4为0时,取余为4,其余都为0.。。。

 1 import java.math.*;

 2 import java.util.*;

 3 

 4 public class Main

 5 {

 6 

 7     public static void main(String[] args)

 8     {

 9         Scanner cin = new Scanner(System.in) ;

10         BigInteger n;

11         n = cin.nextBigInteger();

12         BigInteger t = n.mod(BigInteger.valueOf(4));

13         if(t.compareTo(BigInteger.ZERO) == 0)

14             System.out.println(4) ;

15         else System.out.println(0) ;

16         cin.close();

17     }

18 }
View Code

 

 

C. Boredom

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winter evening he came up with a game and decided to play it.

Given a sequence a consisting of n integers. The player can make several steps. In a single step he can choose an element of the sequence (let's denote it ak) and delete it, at that all elements equal to ak + 1 and ak - 1 also must be deleted from the sequence. That step brings ak points to the player.

Alex is a perfectionist, so he decided to get as many points as possible. Help him.

Input

The first line contains integer n (1 ≤ n ≤ 105) that shows how many numbers are in Alex's sequence.

The second line contains n integers a1a2, ..., an (1 ≤ ai ≤ 105).

Output

Print a single integer — the maximum number of points that Alex can earn.

Sample test(s)
input
2
1 2
output
2
input
3
1 2 3
output
4
input
9
1 2 1 3 2 2 2 2 3
output
10
Note

Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this [2, 2, 2, 2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.

 

题意 : 删掉某个数x,之后你可以得到x分,但同时数列中所有x-1与x+1都要删除,问怎么样删除能得到最大的分数,输出这个分数。

思路 :先哈希一下再dp,dp[i]=max(dp[i-1],dp[i-2]+i*hashh[i]),这个方程代表的是当删除 i 的时候能得到分数,要么是你不删除i,而删除i-1,则得到的是删除i-1时得到的最大的分数,此时i与i-2都会被删掉。

如果你要删除 i ,因此i-1需要被删除,此时得到的分数就是你删除i-2时得到的最大值再加上删除 i 得到的分数。

例如6 7 8

你要是删除7,那你到8这个位置的时候能得到的最大值就是删除7得到的最大值。可是如果你删除6的话,那你到8这个位置时就是删除6得到的最大值再加上删除自己能够得到的分数。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <iostream>

 4 #define LL long long

 5 

 6 using namespace std ;

 7 

 8 int a[100010] ;

 9 LL hashh[100010],dp[100010] ;

10 

11 int main()

12 {

13     int n ;

14     while(scanf("%d",&n)!=EOF)

15     {

16         memset(hashh,0,sizeof(hashh)) ;

17         memset(dp,0,sizeof(dp)) ;

18         int maxx = 0 ;

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

20         {

21             scanf("%d",&a[i]) ;

22             hashh[a[i]] ++ ;

23             maxx = max(a[i],maxx) ;

24         }

25         dp[1] = hashh[1] ;

26         for(int i = 2 ; i <= maxx ; i++)

27             dp[i] = max(dp[i-1],dp[i-2]+i*hashh[i]) ;

28         printf("%I64d\n",dp[maxx]) ;

29     }

30     return 0 ;

31 }
View Code

 

你可能感兴趣的:(codeforces)