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;
}