可能是前几次排名太好飘了,这次却只有210分,排名掉到了第5名,第三题爆零,第四题只有10分(无解的点),机房大佬cydcyd又一次摘得桂冠,拿下315分的高分。
考砸了!
T1
给定行列的六边形,偶数行的向右移动半格,每个六边形有一个权值.或#,求两个六边形之间包含两种权值的边的总数。
思路
正在处理且权值为#,如果,则与相连的六边形有6种。
否则 与相连的六边形有6种。
判断与之相连的六边形权值是否为.,计数。
第1行和第行的情况把边界标为#就能解决。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,cnt;
bool f[52][52];
char c;
int main(){
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>c;
if(c=='.')
f[i][j]=1;//把字符处理成数值,方便下面计算
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
if(!f[i][j]){
cnt+=f[i][j-1]+f[i][j+1]+f[i-1][j]+f[i+1][j];//i为奇或偶数公有的4种情况
if(i%2)
cnt+=f[i-1][j-1]+f[i+1][j-1];//奇数
else
cnt+=f[i-1][j+1]+f[i+1][j+1];//偶数
}
}
cout<<cnt;
return 0;
}
T2
给定个竞选人,个投票者,竞选分-1轮,每轮每个投票者会将票投给他的投票者列表中未被淘汰的第1个人,每轮淘汰获票数最少的人(如有相同,淘汰序号大的人)输出每轮淘汰的人和获胜者。
思路
模拟,把每轮竞选的人的获票数算出来,把淘汰的人打上标记,每个人遍历投票列表,找到第1个未被淘汰的人投票,复杂度。考虑优化,由于淘汰的人不可能再次投票,故可以把每个人现在要投的人的编号存下来,因为编号是单调递增的,所以复杂度。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,a[1001][1001],cnt[1001],Min,ans[1001]={INT_MAX/3},k;
bool f[1001];
int main(){
cin>>n>>m;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=m;i++)
cnt[i]=1;
for(i=1;i<=n;i++){
Min=0;
for(j=1;j<=m;j++)
ans[j]=0;
for(j=1;j<=m;j++)
for(cnt[j];cnt[j]<=n;cnt[j]++){//cnt[j]用于记录第j个人现在会投给谁
if(!f[a[j][cnt[j]]]){
ans[a[j][cnt[j]]]++;
break;
}
}
for(j=1;j<=n;j++)
if(!f[j]&&ans[j]<=ans[Min])
Min=j;//获取淘汰者下标
f[Min]=1;
printf("%d\n",Min);
}
return 0;
}
T3
在一个长方形框子里,最多有个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)
思路
搜索放置顺序,半径肯定不超过点跟边界的距离,而且还要保证当前点和其他点的距离,可以用圆心距来求,先用勾股定理求两点距离,再减去另一点的半径,即可求得。对这些结果求最小。
代码
T4
给定个格子,你在位置,要到达,移动一次要消耗1秒,第1~秒都有闪电劈下来,如果当前格子是导电格,将会传导给与它有连边的其他的导电格,其他的导电格也会继续传导,问要到达一共有多少种走法?
思路
先用搜索求连通块,然后类比过河卒,外层循环枚举行列坐标和,内层循环枚举行坐标,如果在同一个连通块且,则。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,X[4]={1,0,-1,0},Y[4]={0,1,0,-1},color,vis[1002][1002],c[1002][1002],f[1001][1001],l;
bool a[1002][1002];
void dfs(int x,int y){
if(!a[x][y]||vis[x][y])
return;
c[x][y]=color;
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+X[i],yy=y+Y[i];
dfs(xx,yy);
}
}
int main(){
int x,y,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
if(!a[i][j])
c[i][j]=++color;
else if(!vis[i][j]){
++color;
dfs(i,j);
}
}
f[1][1]=1;
for(l=1;l<=n+m-2;l++){
scanf("%d%d",&x,&y);
for(i=1;i<=min(l+1,n);i++){
j=l+2-i;
if(j<=m&&c[i][j]!=c[x][y])
f[i][j]=(f[i-1][j]+f[i][j-1])%100000001;
}
}
if(!f[n][m])
printf("Poor Y!");
else
printf("%d",f[n][m]);
return 0;
}