您的位置:首页 > 其它

2017百度之星

2017-08-12 17:07 113 查看
今天这服务器。。。。

第一题,百度一波儿定理,然后发现就是让求p-1的因子

#include<cstdio>
int main()
{
int p;
int cases; scanf("%d",&cases);
while(cases--)
{

scanf("%d",&p);
p--;
int ans = 0;
for(int i=1;i*i<=p;i++)
{
if(p%i==0)
{
if(i!=p/i) ans+=2;
else ans+=1;
}
}
printf("%d\n",ans);
}
return 0;
}

第五题 暴力啊! 每次day++取模,特判2月就好
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
char s[20];
int monthday[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int cases; int year,month,day;
scanf("%d",&cases);
while(cases--)
{
scanf("%s",s);
year = (s[0]-48)*1000+(s[1]-48)*100+(s[2]-48)*10+(s[3]-48);
month = (s[5]-48)*10+(s[6]-48);
day = (s[8]-48)*10+(s[9]-48);
int ansmonth = month; int ansday = day;
while(1)
{
int tmp = monthday[2];
if((year%4==0&&year%100!=0)||year%400==0)
tmp+=1;
day += 7;
if(month==2&&day>tmp)
day%=tmp,month+=1;
else if(month!=2&&day>monthday[month])
{
day%=monthday[month]; month++;
}
if(month>12) month%=12,year++;
if(month==ansmonth&&day==ansday)
{
printf("%d\n",year);
break;
}
}
}
return 0;
}

第6题,第一遍dfs看有没有1,没有直接输出-1.第二遍看有几个在边界的 0,是1的话输出0,是0的话输出1,否则输出-1.
#include<cstdio>
#include<cstring>
int n,m;
char str[105][105];
int vis[105][105];
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
void dfs(int x,int y)
{
vis[x][y] = 1;
// printf("%d %d\n",x,y);
for(int i=0;i<4;i++)
{
int nx = x+dir[i][0];
int ny = y+dir[i][1];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(vis[nx][ny]||str[nx][ny]=='0') continue;
dfs(nx,ny);
}
}
int flag = 1;
void dfs2(int x,int y)
{
//printf("%d %d\n",x,y);
if(x==0||x==n-1||y==0||y==m-1) flag = 0;
vis[x][y] = 1;
for(int i=0;i<4;i++)
{
int nx = x+dir[i][0];
int ny = y+dir[i][1];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(vis[nx][ny]||str[nx][ny]=='1') continue;
dfs2(nx,ny);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%s",str[i]);
//for(int i=0;i<n;i++) printf("%s",str[i]);
int cnt1 = 0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!vis[i][j]&&str[i][j]=='1')
{dfs(i,j);cnt1++;}
}
}
// printf("%d\n",cnt1);
if(cnt1!=1)
{
printf("-1\n");
continue;
}
memset(vis,0,sizeof(vis));
int cnt0 = 0; int f = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!vis[i][j]&&str[i][j]=='0'){
flag = 1;
dfs2(i,j);
if(flag==1) f++;
cnt0++;
}
}
}
if(f==1)
{
printf("0\n");
continue;
}
if(f==0) printf("1\n");
else printf("-1\n");
}
return 0;
}

ACfun里有人说第二题数据有问题。第二题WA了两次,不知道为什么,应该就是一个镜像并查集啊啊啊。由于服务器的原因 让我一份AC的代码交了多次还要算罚时!!坑爹啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: