[7.8] 纪中C组

来源:互联网 发布:外贸邦海关数据有用吗 编辑:程序博客网 时间:2024/06/04 22:50

这次居然重复了!
前三题都是纪中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!

原创粉丝点击