pat刷题笔记1105-1107

1104-1107是15年冬的真题,下午做了两个半小时,第3题第四题都只拿了一半左右的分数

1104之前做过了(汗),没什么意思而且样例点很玄学,不再赘述

1105
好像是高程的典型例题了,注意就是不要自己给自己加难度,比如for循环区间不用对称的。。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m=1;
    cin>>n;
    int i,j,a[n];
    for(i=0; i<n; i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);

    for(i=1; i<n; i++)
    {
        if(n%i==0&&(abs(i-n/i)<abs(m-n/m)))
        {
            m=i;
        }
    }
    m=n/m;
    int x=0,y=0;
    i=0;
    int b[m][n/m]={0};
    for(x=0; i<n ; x++)
    {
        for(j=x; j<=(n/m-x)-1; j++)
        {
            b[x][j]=a[n-1-i];
            i++;

        }
         if(i==n) break;
        for(j=x+1; j<m-1-x; j++)
        {
            b[j][n/m-1-x]=a[n-1-i];

            i++;
        }
         if(i==n) break;
        for(j=n/m-1-x; j>=x; j--)
        {
            b[m-1-x][j]=a[n-1-i];
            i++;

        }
         if(i==n) break;
        for(j=m-2-x; j>x; j--)
        {
            b[j][x]=a[n-1-i];
            i++;
        }

    }
    for(i=0;i<m;i++)
    {
        cout<<b[i][0];
        for(j=1;j<n/m;j++)
    {
        cout<<' '<<b[i][j];
    }
    cout<<endl;
    }


}

1106
没看清题意,以为是输出层数而不是最优解的个数。导致一开始扣了12分(挺nt的),pat题面是英文,而且部分题目(比如这题)会出现生词,但还是要读完读清啊!!!
这题考察的知识点为bfs,套模板即可

#include<bits/stdc++.h>
using namespace std;
int c=0;
vector<int> chain[100001];
int cnt=0;
void bfs()
{
    queue<int> q;
    int v,i;
    if(chain[0].size()==0) return;
    for(i=0; i<chain[0].size();i++)
    {
        q.push(chain[0][i]);
    }
    c=1;
    q.push(-1);
    while((cnt==0)||(q.front()!=-1))
    {
        v=q.front();
        q.pop();
        if(v!=-1)
        {
            if(chain[v].size()==0)
            {cnt++;}

            int num=chain[v].size();
            for(i=0; i<num; i++)
            {
                q.push(chain[v][i]);
            }

        }
        else if(cnt==0)
        {
            q.push(-1);
            c++;
        }
    }
}
int main()
{
    int n,i,j;
    cin>>n;
    double p,r;
    cin>>p>>r;
    int a,b,num;
    for(i=0; i<n; i++)
    {
        cin>>num;
        for(j=0; j<num; j++)
        {
            cin>>b;
            chain[i].push_back(b);
        }
    }
    bfs();
    if(cnt<1) cnt=1;
    printf("%.4lf %d\n",pow(1+r/100.0,c)*p,cnt);

}

1107
一开始没做出来,扣了13分,原因是没考虑到
1: 1
1: 2
2:1 2
这种情况,即后面的会导致前面的变化,被样例误导了,这也体现出pat的一个特点,过样例可以拿到一半多一点的分数,但是样例一半不会涵盖所有的考点,所以不要只局限于样例的情况

关于并查集和map,下周要学一下这些了,要不然代码量太大会造成低级错误概率变高。。

#include<bits/stdc++.h>
using namespace std;
int had[1001]={0};
vector<int> a[1001];
vector<vector<int> > cluster;
int test(vector<int> t)
{
    for(int j=0;j<cluster.size();j++)
        {
                for(int k=0;k<t.size();k++)
                {
                        if(cluster[j][t[k]]==1)
                        {
                            return j;
                        }
                }
        }
    return -1;
}
bool iscommon(vector<int> t1,vector<int> t2)
{
    for(int i=0;i<t1.size();i++)
    {
        if(t1[i]==1&&t2[i]==1) return true;
    }
    return false;
}
int main()
{
    int n;
    cin>>n;
    int i,j,num,hobby;
    char c;
    for(i=1;i<n+1;i++)
    {
        cin>>num>>c;
        for(j=1;j<num+1;j++)
        {
            cin>>hobby;
            a[i].push_back(hobby);
        }
    }
    for(i=1;i<n+1;i++)
    {
        if(test(a[i])==-1)
        {
            vector<int> b;
            for(j=0;j<1001;j++)
            {
                b.push_back(0);
            }
            for(j=0;j<a[i].size();j++)
            {
                b[a[i][j]]=1;
            }
            cluster.push_back(b);
            had[cluster.size()-1]++;
        }
        else{
             int k=test(a[i]);
             had[k]++;
             for(j=0;j<a[i].size();j++)
            {
                cluster[k][a[i][j]]=1;
            }
        }
    }
    int jian=0;
    for(i=0;i<cluster.size();i++)
        for(j=i+1;j<cluster.size();j++)
    {
        if(iscommon(cluster[i],cluster[j])==true)
        {
            had[i]=had[i]+had[j];
            jian++;
            had[j]=0;
            for(int k=0;k<1001;k++)
            {
                if(cluster[j][k]==1)
                {
                    cluster[i][k]=1;
                    cluster[j][k]=0;
                }
            }

        }
    }
    cout<<cluster.size()-jian<<endl;
    sort(had,had+1001);
    cout<<had[1000];
    for(i=1;i<cluster.size()-jian;i++)
    {
        cout<<' '<<had[1000-i];
    }
    cout<<endl;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值