[7.8] 纪中C组

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值