1. 程式人生 > >2017百度之星初賽(A)1001,1005,1006解題報告

2017百度之星初賽(A)1001,1005,1006解題報告

百度 src cout lose 初賽 bool amp spa span

1001 小C的倍數問題

純簽到題,求p-1的因數個數,暴力枚舉即可

技術分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     ios::sync_with_stdio(false);
 6     int t,p,cnt,n,num;
 7     cin>>t;
 8     while(t--)
 9     {
10         cnt=0;
11         cin>>p;
12         n=p-1;
13         for(int i=1
;i*i<=n;++i){ 14 if(n%i==0){ 15 cnt++; 16 if(i*i!=n) 17 cnt++; 18 } 19 } 20 cout<<cnt<<endl; 21 } 22 return 0; 23 }
View Code

1005 今夕何夕

利用蔡勒公式,可以知道任何一天的星期數,特判一下閏年的2.29就可以了。枚舉年數

技術分享
 1 #include<bits/stdc++.h>
 2
using namespace std; 3 int Cal(int y,int m,int d) 4 { 5 int c,w; 6 bool flag=false; 7 if(y%400==0||(y%4==0&&y%100!=0)) 8 flag=true; 9 if(flag==false&&m==2&&d==29) 10 return -1; 11 if(m<=2){ 12 y--; 13 m+=12; 14 } 15 c=y/100
; 16 y%=100; 17 w=y+y/4+c/4-2*c+13*(m+1)/5+d-1; 18 while(w<0) 19 w+=7; 20 w%=7; 21 return w; 22 } 23 int main() 24 { 25 //freopen("in.txt","r",stdin); 26 int t,y,m,d,w,c,n; 27 scanf("%d",&t); 28 while(t--) 29 { 30 scanf("%d-%d-%d",&y,&m,&d); 31 w=Cal(y,m,d); 32 while(1) 33 { 34 ++y; 35 n=Cal(y,m,d); 36 if(w==n) 37 break; 38 } 39 printf("%d\n",y); 40 } 41 return 0; 42 }
View Code

1006 度度熊的01世界

把第一個遇到的1用dfs賦值為2,然後掃一遍圖看是否有1,如果有就說明有多塊1,輸出-1。
然後再把圖掃一遍,碰到0就進去dfs。如果在任何一次整個dfs過程中沒有碰到邊界,說明這一塊0是被1包圍的。然後再繼續找,如果有多個0被1包圍,則輸出-1,如果只有一個輸出0,一個都沒有輸出1。

技術分享
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=110;
  4 char g[maxn][maxn];
  5 int n,m;
  6 int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
  7 bool visit[maxn][maxn];
  8 bool flag_1;
  9 bool check(int x,int y)
 10 {
 11     if(x<1||x>n||y<1||y>m)
 12         return false;
 13     return true;
 14 }
 15 void dfs(int x,int y)
 16 {
 17     int dx,dy;
 18     g[x][y]=2;
 19     visit[x][y]=false;
 20     for(int i=0;i<4;++i){
 21         dx=x+dis[i][0];
 22         dy=y+dis[i][1];
 23         if(check(dx,dy))
 24             if(g[dx][dy]==1&&visit[dx][dy])
 25                 dfs(dx,dy);
 26     }
 27 }
 28 bool solve1()
 29 {
 30     for(int i=1;i<=n;++i)
 31         for(int j=1;j<=m;++j){
 32             if(g[i][j]==1){
 33                 return false;
 34             }
 35         }
 36     return true;
 37 }
 38 void Searc(int x,int y)
 39 {
 40     visit[x][y]=false;
 41     int dx,dy;
 42     for(int i=0;i<4;++i){
 43         dx=x+dis[i][0];
 44         dy=y+dis[i][1];
 45         if(check(dx,dy)){
 46             if(visit[dx][dy])
 47                 Searc(dx,dy);
 48         }
 49         else
 50             flag_1=false;
 51     }
 52 }
 53 bool is_one()
 54 {
 55 
 56     for(int i=1;i<=n;++i)
 57         for(int j=1;j<=m;++j){
 58             if(g[i][j]==0&&visit[i][j]){
 59                 flag_1=true;
 60                 Searc(i,j);
 61                 if(flag_1)
 62                     return true;
 63             }
 64         }
 65     return false;
 66 }
 67 int main()
 68 {
 69     ios::sync_with_stdio(false);
 70     //freopen("in.txt","r",stdin);
 71     while(cin>>n>>m)
 72     {
 73         memset(g,0,sizeof(g));
 74         memset(visit,true,sizeof(visit));
 75         for(int i=1;i<=n;++i)
 76             cin>>g[i]+1;
 77         bool flag=false;
 78         for(int i=1;i<=n;++i){
 79             for(int j=1;j<=m;++j)
 80                 if(g[i][j]==1){
 81                     flag=true;
 82                     dfs(i,j);
 83                     break;
 84                 }
 85             if(flag)
 86                 break;
 87         }
 88         if(flag==false||(!solve1())){
 89             cout<<-1<<endl;
 90             continue;
 91         }
 92         if(!is_one())
 93             cout<<1<<endl;
 94         else if(is_one())
 95             cout<<-1<<endl;
 96         else
 97             cout<<0<<endl;
 98     }
 99     return 0;
100 }
View Code

2017百度之星初賽(A)1001,1005,1006解題報告