这次居然重复了!
前三题都是纪中3.25普及C组的题目!
第一题
傻[嘟——]题
其实就是把俩小数对除然后快排啊。。。
但是我初评的时候居然没A
原因居然是调整精度的那0.005
#include <iostream>
#include <cstdio>
using namespace std;
float gpt,xf,gpa[100001];
int i,n,k;
void qs(int l,int h)
{
int i=l,j=h;
float mid=gpa[(l+h)/2],t;
if (l>=h) return;
do
{
while (gpa[i]>mid) i++;
while (gpa[j]<mid) j--;
if (i<=j)
{
t=gpa[i];gpa[i]=gpa[j];gpa[j]=t;
i++;j--;
}
}
while (i<=j);
qs(i,h);
qs(l,j);
}
int main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++)
{
scanf("%f%f",&gpt,&xf);
gpa[i]=gpt/xf;
}
qs(1,n);
printf("%0.2f",gpa[k]);
}
第二题
也是超级傻[嘟——]的题
线性的前缀和,于是AC
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,i,a[100001],x,y;
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",a[y]-a[x-1]);
}
}
第三题
比较不水了
就是一波递推
把上面和左边的方法数加起来就好了
还有~~膜的~~mod一下题目要求的数量
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,p,a[101][101],f[101][101][2001],i,j,k;
int main()
{
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%d",&a[i][j]);
f[0][1][0]=1;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
for (k=a[i][j];k<=p;k++)
{
f[i][j][k]+=f[i-1][j][k-a[i][j]]+f[i][j-1][k-a[i][j]];
f[i][j][k]=f[i][j][k]%1000000007;
}
printf("%d",f[n][m][p]);
}
第四题
其实也蛮简单的
只是初评时菜!没发挥好而已
这是一波快排和递归
快排将字符串按字典序排好
这道题可以看出要用到全排列,所以开始的时候把1到3000的全排列方式总数求出来
(当然这题也有膜的 mod的啦)
然后递归深度为字符串的指针
慢慢的拉下去,最后分解到不能再分解(深度超过最长长度时)就返回全排列的值
好难讲啊!!!!
拉下去的过程是寻找(在该深度中)不一致的字符,形成一个字符全部一致的区间,SO,这个区间就能深度加深又一波递归了
哦,还有把每个独立的区间看成一个整体,还是需要再套一次全排列的
#include <fstream>
#include <string>
using namespace std;
int n,i,j,ml,l[3001];
long long s[3001];
string c[3001];
void qs(int low,int high)
{
int i=low,j=high;
string mid,t;
mid=c[(low+high)/2];
if (low>=high) return;
do
{
while (c[i]>mid) i++;
while (c[j]<mid) j--;
if (i<=j)
{
t=c[i];c[i]=c[j];c[j]=t;
i++;j--;
}
}
while (i<=j);
qs(i,high);
qs(low,j);
}
long long dg(int l,int h,int dep)
{
int i,t,pre;
long long d;
char prechar;
if (dep>ml-1) return s[h-l+1];
pre=l;d=1;prechar=c[l][dep];t=1;
for (i=l+1;i<=h;i++)
if (prechar!=c[i][dep])
{
t++;
d=(d*dg(pre,i-1,dep+1)%1000000007)%1000000007;
pre=i;
prechar=c[i][dep];
}
if (pre!=h)
d=(d*dg(pre,h,dep+1))%1000000007;
d=(d*s[t])%1000000007;
return d;
}
int main()
{
ifstream fin("ranking.in",ios::in);
ofstream fout("ranking.out",ios::out);
fin>>n;
for (i=1;i<=n;i++)
{
fin>>c[i];
l[i]=c[i].length();
ml=l[i]>ml? l[i]:ml;
}
for (i=1;i<=n;i++)
if (l[i]<ml)
for (j=l[i]+1;j<=ml;j++)
c[i]=c[i]+'0';
qs(1,n);
s[0]=1;
for (i=1;i<=3000;i++)
s[i]=(s[i-1]*i)%1000000007;
fout<<dg(1,n,0);
}
想一想还有八天。。
我的R!
666

被折叠的 条评论
为什么被折叠?



