BestCoder Round #43

pog loves szh I

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 207    Accepted Submission(s): 144


Problem Description
Pog has lots of strings. And he always mixes two equal-length strings. For example, there are two strings: "abcd" and "efgh". After mixing, a new string "aebfcgdh" is coming.

However, szh thinks it is boring, so he reverses the second string, like changing "efgh" to "hgfe". Then mix them as usual, resulting in "ahbgcfde".

Now, here comes a problem. Pog is given a string after mixing by szh, but he wants to find the original two strings. 

Hint : In this question, it needs a linefeed at the end of line at hack time.
 

Input
The first line has an integer,  T(1T100) , indicating the number of cases.

Then follows  T  lines. Every lines has a string S, whose length is even and not more than  100 , and only consists of lower-case characters('a'~'z').
 

Output
For each cases, please output two lines, indicating two original strings.
 

Sample Input
  
  
1 aabbca
 

Sample Output
  
  
abc aba For example, there are two strings: "abcd" and "efgh". After mixing, a new string "aebfcgdh" is coming.

   水题。。。。。

pog loves szh II

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 937    Accepted Submission(s): 266


Problem Description
Pog and Szh are playing games.There is a sequence with  n  numbers, Pog will choose a number A from the sequence. Szh will choose an another number named B from the rest in the sequence. Then the score will be  (A+B)  mod  p .They hope to get the largest score.And what is the largest score?
 

Input
Several groups of data (no more than  5  groups, n1000 ).

For each case:  

The following line contains two integers, n(2n100000) p(1p2311)

The following line contains  n  integers  ai(0ai2311)
 

Output
For each case,output an integer means the largest score.
 

Sample Input
  
  
4 4 1 2 3 0 4 4 0 0 2 2
 

Sample Output
  
  
3 2
 

Source

题意:给定序列中找出a,b 使得(a+b)/p 的值最大 

首先将n个数据模p后再保存进数组ss,然后升序排序,序号为0 - n-1

如果ss[n-1]+ss[n-2]<p  直接输出即可 

否则从头枚举一遍  并且找到一个最大的数字与其相加之和小于p 我们可以看到最大的数字一定是从右往左寻找           因为序列时是序的

枚举时有技巧 用now记录当前最大的位置  下次只需从now的位置往前找

WA了很多次,后来才发现会数据溢出

AC代码:

#include <stdio.h>

#include "string.h"

#include <algorithm>

using namespace std;

int main(void)

{

    int n,p;

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

    {

        int ss[100001],now,max=0;

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

        {

            int temp;

            scanf("%d",&temp);

            temp=temp%p;

            ss[i]=temp;

        }

        sort(ss,ss+n);

        max=ss[n-2]+ss[n-1];

        if(p-ss[n-1]>ss[n-2]) printf("%d\n",max); //之前是max<p 一直WA 后来发现数据溢出了 或者改成long型就可以了

        else {

            max=max-p; //之前是max=max%p 一直WA

            now=n-1;

            for(int i=0;i<now;i++)

            {

                while(i<now)

                {

                    if((ss[i]+ss[now])<p){

                        if((ss[i]+ss[now])>max)

                            max=ss[now]+ss[i];

                        break;

                    }

                    else now--;

                }

                if(max==p-1) break;//剪枝 最大的可能值是p-1

            }

            printf("%d\n",max);

        }

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值