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
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.
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').
1 aabbca
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
For each case:
The following line contains two integers, n(2≤n≤100000) , p(1≤p≤231−1) 。
The following line contains n integers ai(0≤ai≤231−1) 。
4 4 1 2 3 0 4 4 0 0 2 2
3 2
题意:给定序列中找出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);
}
}
}