您的位置:首页 > 其它

15省赛题回顾

2016-05-06 09:43 344 查看
D.锐雯上单不给就送

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct Matrix
{
double mat[5][5];
}a;
Matrix mul(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
c.mat[i][j]=0;
for(int k=0;k<5;k++)
c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j]);
}
}
return c;
}
Matrix mod_pow(Matrix p,int n)
{
Matrix res;
memset(res.mat,0,sizeof(res.mat));
for(int i=0;i<5;i++)
res.mat[i][i]=1;
while(n)
{
if(n&1)
res=mul(res,p);
p=mul(p,p);
n>>=1;
}
return res;
}
int main()
{
int T,n;
freopen("in.txt","r",stdin);
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>a.mat[i][j];
int num;
cin>>num;
if(n==1)
{
cout<<num<<endl;
continue;
}
Matrix ans=mod_pow(a,n-1);
double maxn=0,sum=0,index=0;
for(int i=0;i<5;i++)
{
if((ans.mat[i][num-1]-maxn)>0.0000001)
{
maxn=ans.mat[i][num-1];
index=i;
}
}
cout<<index+1<<endl;
}
return 0;
}


I.梯田

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define Max 1000005
int map[105][105],vis[105][105];
int n,m,p,q;
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
int ans,h;
int dfs(int x,int y)
{
if(map[x][y]>h||x<0||y<0||x>n+1||y>m+1||vis[x][y]==1)
return 0;
ans++;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int x0=x+dx[i];
int y0=y+dy[i];
dfs(x0,y0);
}
return 0;
}
int main()
{
int T;
freopen("in.txt","r",stdin);
cin>>T;
while(T--)
{
int u=-1;
cin>>n>>m>>p>>q;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>map[i][j];
int l=0,r=Max,mid;
while(r-l>1)
{
memset(vis,0,sizeof(vis));
h=mid=(l+r)/2;
ans=0;
dfs(0,0);
ans-=(2*n+2*m+4);
//    cout<<mid<<" "<<ans<<endl;
if(ans<=q&&ans>=p)
{
u=mid;
r=mid;
}
else if(ans>q)
r=mid;
else
l=mid;
}
cout<<u<<endl;
}
}


J.镜像树

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define Max 105
struct node
{
int l,r;
}tree[Max];
int val[Max];
bool flag;
int dfs(int x,int y)
{
if(flag)
return 0;
if(x==y&&x==0)
return 0;
if((x==0&&y!=0)||(x!=0&&y==0))
{
flag=1;
return 0;
}
if(val[x]!=val[y])
{
flag=1;
return 0;
}
dfs(tree[x].l,tree[y].r);
dfs(tree[x].r,tree[y].l);
return 0;
}
int main()
{
int T,u,n;
freopen("in.txt","r",stdin);
cin>>T;
while(T--)
{
flag=0;
memset(tree,0,sizeof(tree));
memset(val,0,sizeof(val));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>u;
cin>>tree[u].l>>tree[u].r;
}
for(int i=1;i<=n;i++)
cin>>val[i];
dfs(2,3);
if(flag)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: