2003:
T4:
题目大意:
讲这么多话,其实就是求比当前序列大的序列中第m小的一个。可以每次找出比当前序列大的最小的一个序列。我们可以从后往前扫描,当当前这个数比后一个数小时,我们把它与它后面的数中比它大的最小的一个交换,再将它之后的数从小到大排序,
就得到比当前序列大的最小的一个序列了
列: 1 2 3 6 8 7 5 4这个序列,找比它大的最小的序列,我们从后往前扫描,扫到6时发它比它后面一个数8小,我们就将它与它后面比它大的最小的一个数交换,为7,交换后序列为1 2 3 7 8 6 5 4,再将7后的数从小到大排序,变成1 2 3 7 4 5 6 8.
这就是比1 2 3 6 8 7 5 4大的最小的一个序列了。
错题原因:
就拿1 2 3 6 8 7 5 4来说,我只把6加了1,再把它后面最小的数减了1,没考虑后面最小的数可能有比它大2或更多的数;
AC代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std; const int N=; int n,m;
int a[N]; int main()
{
scanf("%d%d",&n,&m); for(int i=;i<=n;i++) scanf("%d",&a[i]); while(m--)
{
int i=n;
while(a[i-]>a[i]) i--;
i--; int j=i;
while(j+<=n&&a[j+]>a[i]) j++;
swap(a[i],a[j]); reverse(a+i+,a++n);
} for(int i=;i<=n;i++)
{
printf("%d ",a[i]);
}
}
2004:
T1:
题目大意:
根据输入计分。
错题原因:
它要按照标准比赛要求,必须一方分数大于指定分数,两人的分差还得≥2 。你题目又不说,害我只得五十分(╬ ̄皿 ̄) 。
T4:
题目大意:
求 2^p-1 的后500位和它的位数。
错题原因:
位数可以直接用 p㏒2 下取整 +1 求,然而我直接数,超时了。(什么log玄学,不知道!)
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std; const int N=; int len_a;
int res[N],a[N];
int c[N]; void mul(int a[],int b[])
{
memset(c,,sizeof(c));
for(int i=;i<=;i++)
{
int t=;
for(int j=;j<=;j++)
{ int k=i+j-;
c[k]+=a[i]*b[j]+t;
t=c[k]/;
c[k]%=; } } for(int i=;i<=;i++) a[i]=c[i]; } void qmi(int k)
{
res[]=;
a[]=; while(k)
{ if(k&) mul(res,a);
mul(a,a);
k>>=;
} res[]--;
printf("%d\n",len_a);
for(int i=,j=;i;i--,j++)
{
if(len_a<i) printf("");
else printf("%d",res[i]);
if(j==) puts(""),j=;
}
} int main()
{
int n;
scanf("%d",&n);
len_a=(int)(n*log10())+;
qmi(n); }