百度(pending)之星 2017 初赛A

hdu6108

数学表达式推一推,可知答案就是求(p-1)的因子数目+2

#include<bits/stdc++.h>
using namespace std;
int count(int x)
{
	x--;
    int len=sqrt(x);
    //printf("shit%d\n",len);
    int sum=0;
    for(int i=2;i<=len;i++)
    {
        if(x%i==0)
        {
        	if(x/i==i)
        		sum++;
        	else
        		sum+=2;
		}
    }
    return sum;
}
int main()
{
    int n,t;
    while(scanf("%d",&t)==1)
    {
        for(int i=1;i<=t;i++)
        {
            scanf("%d",&n);
          //  printf("fuck %d\n",count(n));
            int ans=2+count(n);
            printf("%d\n",ans);
        }
    }
    return 0;
}

 hdu6112

算日期的细节题。需要考虑全面,当然每次做日期题都是差不多的套路。

#include<bits/stdc++.h>
using namespace std;
const int maxn=20000;
int day[maxn];
struct Date
{
	int y;//year
	int m;//month
	int d;//day in month
};
bool isLeap(int y)//判断是否是闰年
{
	return y%4==0&&y%100!=0||y%400==0;//真返回为1,假为0
}
int daysOfMonth(int y,int m)
{
	int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(m!=2)
		return day[m-1];
	else 
		return 28+isLeap(y);
}
int daysOfDate(Date d)//计算一共的天数
{
	int days=d.d;
	days += day[d.y-1];
	for(int m=1;m<d.m;m++)//计算月
		days+=daysOfMonth(d.y,m);
	//days+=d.d;
	return days;
}
bool judge(Date d2)
{
	if(isLeap(d2.y)==0&&d2.m==2&&d2.d==29)
		return false;
	return true;
}
void init()
{
	day[0] = 0;
	for(int y=1;y<maxn;y++)
		day[y] = day[y-1] +365 +isLeap(y);
}
int main()
{
	Date d1,d2;
	int t;
	scanf("%d",&t);
	init();
	while(t--)
	{
		scanf("%d-%d-%d", &d1.y, &d1.m, &d1.d);
		d2.y=d1.y;d2.m=d1.m;d2.d=d1.d;
		int days1=daysOfDate(d1);
		while(1)
		{
			d2.y++;
			if(!judge(d2))	continue;
			int days2=daysOfDate(d2);
			int ans=days2-days1;
			if(ans%7==0)
				break;
		}
		printf("%d\n",d2.y);
	}
	return 0;
}

 hdu6113

遍历一下图就能解决的题。根据要求只要提取两个关键信息:1的连通块数目,0的不靠墙连通块数目即可。我的flagy是多余的,可以代替。

#include<bits/stdc++.h>
using namespace std;
int dir[4][2]={0,1,1,0,-1,0,0,-1};
const int maxn=108;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int n,m;
bool judge(int x,int y)
{
	if(x<0||x>=n)	return false;
	if(y<0||y>=m)	return false;
	return true;
}
void dfs1(int x,int y)
{
	int nx,ny;
	vis[x][y]=true;
	for(int i=0;i<4;i++)
	{
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(judge(nx,ny)&&vis[nx][ny]==false&&mp[nx][ny]=='1')
			dfs1(nx,ny);
	}
}
bool dfs2(int x,int y)
{
	int nx,ny;
	bool flag=true;
	for(int i=0;i<4;i++)
	{
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(judge(nx,ny)==false)
			flag=false;
	}
	vis[x][y]=true;
	for(int i=0;i<4;i++)
	{
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(judge(nx,ny)&&vis[nx][ny]==false&&mp[nx][ny]=='0')
		{
			if(dfs2(nx,ny)==false)
				flag=false;
		}
	}
	return flag;
}
int main()
{
	while(scanf("%d%d",&n,&m)==2)
	{
		memset(vis,false,sizeof(vis));
		for(int i=0;i<n;i++)
			scanf("%s",mp[i]);
		int sx,sy;
		sx=sy=0;
		bool flagy=false;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
				if(vis[i][j]==false)
				{
					if(mp[i][j]=='1')
					{
						sx++;
						dfs1(i,j);
					}
					else
					{
						if(dfs2(i,j)==true)
						{
							sy++;
							flagy=true;
						}
					}
				}
			}
	//	printf("%d %d ",sx,sy);		if(flagy==false)	printf("0\n");	else	printf("1\n");
		if(sx==1&&sy==1&&flagy==true)
			printf("0\n");
		else if(sx==1&&flagy==false)
			printf("1\n");
		else
			printf("-1\n");
	}
	return 0;
}

  

posted on 2017-08-12 20:29  此剑之势愈斩愈烈  阅读(141)  评论(0编辑  收藏  举报

导航