校内测试618

今天是618

题目:(只做前三题)

T1多项式输出

洛谷P1067

既然题目中系数按从高到低开始输出,那我们从n到1开始存

具体见代码

#include<iostream>//评测机拒绝万能头 
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[105],n;
int main()
{
    //freopen("poly.in","r",stdin);考试别忘写 
    //freopen("poly.out","w",stdout);
    scanf("%d",&n);
    for(int i=n;i>=0;i--)
     scanf("%d",&a[i]);
    for(int i=n;i>=0;i--)//i即为当前x的指数 
    {
     if(i!=n&&a[i]>0)printf("+");//注意输出的第一项没有加号 
     if(a[i]==-1&&i!=0)printf("-"); 
     if(a[i]!=0&&a[i]!=1&&a[i]!=-1)printf("%d",a[i]);//如果abs(a[i])==1 ,则不输出1(-1) 
     if(i>1&&a[i]!=0)printf("x^%d",i);//i为1时只输出x 
     if(i==1&&a[i]!=0)printf("x");
     if((a[i]==1||a[i]==-1)&&i==0)printf("%d",a[i]);
    } 
    return 0;
}

 

T2:分数线划定

洛谷P1068

特别注意画黄线的部分!!!(忘记输出,结果100分没了QAQ)

简单来说,读入完之后先排序,算出k=m*1.5后注意会有分数相同的人,如果有分数相同的人,就一直m+1。最后输出小坑见代码。

#include<iostream>//评测机不喜欢万能头 
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
struct rr{
    int bh,f;
}r[5005];
bool cmp(rr a,rr b)
{
    if(a.f!=b.f)return a.f>b.f;
    return a.bh<b.bh;
}
int main()
{
//     freopen("score.in","r",stdin);
//     freopen("score.out","w",stdout);
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++)
      scanf("%d%d",&r[i].bh,&r[i].f);
     sort(r+1,r+1+n,cmp);
     int mm=(double)m*1.5;
     int k=mm;
     while(r[k].f==r[mm].f)k++;
     if(r[k].f!=r[mm].f)k--;//其实可以直接写成k-- 
     printf("%d %d\n",r[k].f,k);
     for(int i=1;i<=k;i++)
     {printf("%d %d\n",r[i].bh,r[i].f);
     }
     return 0;
}

T3:细(zhi)胞(bi)分(fen)裂(li)

洛谷P1069

 

 数据那么大,显然是一道数学题

仔细思索,把题目翻译一下,对于每个si,求m1^m2|si^k的k的最小值。

我们看到数据范围,显然硬求会爆炸,那我们不妨分解一下质因数

对m1和每个输入的si分解质因数后,逐一比较m1与s的每个质因子的次数。

当然,如果有一个m1有的质因子,si没有,那就不用往下继续算了。

若si^k能被m1^m2整除,则对于s的每个质因子qi来说,它的次数ai一定大于m1的qi的次数bi,而且细胞每次分裂,对每个ai来说,都相当于加上一个最初的ai(刚分解完质因数的ai)。这时,问题转换为对每个ai求c*ai>=bi,c的最大值。

再从所有的c中,找出最小的那个,就是答案。若最后的答案没有被更新过,就输出-1。

特殊情况:m1=1 这时无论si怎样都可以在0秒内均分

代码

代码中有一些unbelievable的地方

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
//1.m1,所有的s质因数分解(m1的所有质因数的次数*m2)
//2.比较每个s与m1分出的质因数的次数(没包含全,直接continue),用m1的次数/s的次数向上取整,找出每个最大,将每个最大取最小
//3.特判试管==1 
int m2,n,ans=2147483647;
struct pri{
    int all,ys[30005],cs[30005],zhi;//ys[i]是第i个质因数,cs[i]是第i个质因数的次数,zhi就是m1,s的值,all是一共有几个不同的质因数
}m1,s;
void fj(pri &kk)//分解质因数
{    memset(kk.ys,0,sizeof(kk.ys));
     memset(kk.cs,0,sizeof(kk.cs));
    for(int i=2;i*i<=kk.zhi;i++)
    {
        if(kk.zhi%i==0)
        {
          kk.all++;
          kk.ys[kk.all]=i;
          kk.cs[kk.all]=1;
          kk.zhi/=i;
          while(kk.zhi%i==0)
          {
            kk.cs[kk.all]++;
            kk.zhi/=i;
          }
        }
    }
    if(kk.zhi>1)
     {kk.ys[++kk.all]=kk.zhi;
      kk.cs[kk.all]++;
     }
}
int main()
{   
    scanf("%d",&n);
    scanf("%d%d",&m1.zhi,&m2);
    if(m1.zhi==1){printf("0\n");return 0;}//小心有坑
    fj(m1);    
    for(int i=1;i<=m1.all;i++)
     {m1.cs[i]*=m2;
     }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s.zhi);
        s.all=0;
        fj(s);
        if(s.all<m1.all)continue;//如果s的质因数的种数还没有m1多,则s肯定不能包含所有m1有的质因数
        int aans=0;
        bool flag=0;int ss=1;
        if(s.all>=m1.all)//其实这句可以去掉的说
        {
            for(int j=1;j<=m1.all;j++)
          { 
            while(ss<=s.all&&s.ys[ss]<m1.ys[j])++ss;
            if(ss>s.all||s.ys[ss]>m1.ys[j])break;//如果有一个质因数s没有,就不用继续算下去了
            int h=m1.cs[j]/s.cs[ss];
            if((m1.cs[j]%s.cs[ss]))h++;//注意这里用ceil会出现一些unbelievable的事情,比如说你会wa
            if(h>aans)aans=h;//取最大值
            if(j==m1.all)flag=1;
            else flag=0;  
          }
        }
        if(flag)
          ans=min(ans,aans);//所有最大值中取min
    }
    if(ans==2147483647)ans=-1;//未被更新,则证明没有细胞能满足条件
    printf("%d",ans);
}

终于搞完了qwq

T4:道路游戏

 洛谷P1070

此题木有做,先咕咕咕着

posted @ 2019-06-18 20:16  千载煜  阅读(159)  评论(0编辑  收藏  举报