HDU1219-1226(杭州电子科技大学第三届程序设计大赛+部分题解)

1219 水~

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxn = 30;

 4 int a[ maxn ];

 5 char s[ 100005 ];

 6 int main(){

 7     while( gets( s )!=NULL ){

 8         memset( a,0,sizeof( a ) );

 9         int len=strlen( s );

10         for( int i=0;i<len;i++ ){

11             if( s[i]>='a'&&s[i]<='z' )

12                 a[ s[i]-'a' ]++;

13         }

14         for( int i=0;i<26;i++ ){

15             printf("%c:%d\n",i+'a',a[i]);

16         }

17         printf("\n");

18     }

19     return 0;

20 }

 1222

我是找规律的。。。对于n,m,如果他们之间有公共约数,则说明在狼走第二圈的时候,会走重复的点。

View Code
 1 #include<stdio.h>

 2 int gcd( int a,int b ){

 3     int r;

 4     while( b ){

 5         r=a%b;

 6         a=b;

 7         b=r;

 8     }

 9     return a;

10 }

11 int main(){

12     int t;

13     scanf("%d",&t);

14     while(t--){

15         int n,m;

16         scanf("%d%d",&m,&n);

17         //while( m>n )

18             //m-=n;

19         if( m==1||n==1 ){

20             printf("NO\n");

21             continue;

22         }

23         if( m==n ){

24             printf("YES\n");

25             continue;

26         }

27         if( gcd(n,m)!=1 ){

28             printf("YES\n");

29         }

30         else{

31             printf("NO\n");

32         }

33     }

34     return 0;

35 }            

 1224

SPFA  挺水的~~~

简单题吧

View Code
  1 #include<stdio.h>

  2 #include<string.h>

  3 #include<stdlib.h>

  4 #include<algorithm>

  5 #include<queue>

  6 #include<stack>

  7 using namespace std;

  8 const int maxn = 105;

  9 const int maxm = 10000;

 10 const int inf = 99999999;

 11 int cnt,head[ maxn ];

 12 struct node{

 13     int u,val,next;

 14 }edge[ maxm ];

 15 int n,m;

 16 int val[ maxn ];

 17 int dis[  maxn ],vis[ maxn ],path[ maxn ];

 18 

 19 void init(){

 20     cnt=0;

 21     memset( head,-1,sizeof( head ));

 22 }

 23 

 24 void addedge( int a,int b,int c ){

 25     edge[ cnt ].u=b;

 26     edge[ cnt ].val=c;

 27     edge[ cnt ].next=head[ a ];

 28     head[ a ]=cnt++;

 29 }

 30 

 31 void bfs(){

 32     for( int i=1;i<=n+1;i++ ){

 33         vis[i]=0;

 34         dis[i]=-inf;

 35         path[i]=-1;

 36     }

 37     queue<int>q;

 38     while( !q.empty() )

 39         q.pop();

 40     q.push( 1 );

 41     vis[1]=1;

 42     dis[1]=0;

 43     while( !q.empty() ){

 44         int now=q.front();

 45         q.pop();

 46         vis[ now ]=0;

 47         for( int i=head[ now ];i!=-1;i=edge[ i ].next ){

 48             int next=edge[i].u;

 49             if( dis[next]<dis[now]+val[next] ){

 50                 dis[next]=dis[now]+val[next];

 51                 path[next]=now;

 52                 if( vis[next]==0 ){

 53                     vis[next]=1;

 54                     q.push(next);

 55                 }

 56             }

 57         }

 58     }

 59 }

 60 void output(){

 61     printf("points : %d\n",dis[n+1]);

 62     stack<int>s;

 63     for( int i=n+1;i!=-1;i=path[i] ){

 64         s.push( i );

 65     }

 66     printf("circuit : ");

 67     printf("%d",s.top());

 68     s.pop();

 69     while( !s.empty() ){

 70         if( s.top()==(n+1) )

 71             printf("->%d",1);

 72         else

 73             printf("->%d",s.top());

 74         s.pop();

 75     }

 76     printf("\n");

 77 }

 78 int main(){

 79     int T;

 80     scanf("%d",&T);

 81     for( int ca=1;ca<=T;ca++ ){

 82         if( ca!=1 )

 83             printf("\n");

 84         scanf("%d",&n);

 85         for( int i=1;i<=n;i++ )

 86             scanf("%d",&val[ i ]);

 87         val[n+1]=0;

 88         scanf("%d",&m);

 89         int a,b;

 90         init();

 91         while( m-- ){

 92             scanf("%d%d",&a,&b);

 93             if( a<b ){

 94                 addedge( a,b,0 );

 95             }

 96             else if( a>b ){

 97                 addedge( b,a,0 );

 98             }

 99         }

100         bfs();

101         printf("CASE %d#\n",ca);

102         //printf("%d\n",dis[n+1]);

103         output();

104     }

105     return 0;

106 }

 1225

字符串的水题~~~

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<algorithm>

 4 using namespace std;

 5 const int maxn = 5005;

 6 struct node{

 7     char name[ 105 ];

 8     int win,lost,diff,score;

 9 }team[ maxn ];

10 int cnt;

11 void init( int n ){

12     for( int i=0;i<=n;i++ ){

13         team[ i ].win=team[ i ].lost=team[ i ].diff=team[ i ].score=0;

14         //memset( team[i].name,'\0',sizeof( team[i].name ));

15     }

16     cnt=0;

17 }

18 int find( char tt[] ){

19     if( cnt==0 ){

20         strcpy( team[0].name,tt );

21         cnt++;

22         return 0;

23     }

24     int i;

25     for( i=0;i<cnt;i++ ){

26         if( strcmp( tt,team[i].name )==0 ){

27             return i;

28         }

29     }

30     if( i==cnt ){

31         strcpy( team[cnt].name,tt );

32         cnt++;

33         return cnt-1;

34     }

35 }

36 bool cmp( node a,node b ){

37     if( a.score!=b.score )

38         return a.score>b.score;

39     else if( a.diff!=b.diff )

40         return a.diff>b.diff;

41     else if( a.win!=b.win )

42         return a.win>b.win;

43     else if( strcmp( a.name,b.name )>0 )

44         return false;

45     else return true;

46 }

47 int main(){

48     int n;

49     while( scanf("%d",&n)!=EOF ){

50         init( n );

51         char n1[ 105 ],n2[ 105 ];

52         int num1,num2;

53         for( int i=0;i<(n*(n-1));i++ ){

54             scanf("%s VS %s %d:%d",n1,n2,&num1,&num2);

55             int f1=find( n1 );

56             int f2=find( n2 );

57             if( num1==num2 ){

58                 team[ f1 ].score++;

59                 team[ f2 ].score++;

60                 team[ f1 ].win+=num1;

61                 team[ f1 ].lost+=num1;

62                 team[ f2 ].win+=num2;

63                 team[ f2 ].lost+=num2;

64             }

65             else if( num1>num2 ){

66                 team[ f1 ].win+=num1;

67                 team[ f1 ].lost+=num2;

68                 team[ f2 ].win+=num2;

69                 team[ f2 ].lost+=num1;

70                 team[ f1 ].score+=3;

71             }

72             else if( num1<num2 ){

73                 team[ f1 ].win+=num1;

74                 team[ f1 ].lost+=num2;

75                 team[ f2 ].win+=num2;

76                 team[ f2 ].lost+=num1;

77                 team[ f2 ].score+=3;

78             }

79         }

80         for( int i=0;i<n;i++ ){

81             team[ i ].diff=team[ i ].win-team[ i ].lost;

82         }

83         sort( team,team+n,cmp );

84         for( int i=0;i<n;i++ ){

85             printf("%s %d\n",team[i].name,team[i].score);

86         }

87         printf("\n");

88     }

89     return 0;

90 }

 1226

BFS+5000个状态+mod!!!

View Code
  1 #include<stdio.h>

  2 #include<stdlib.h>

  3 #include<string>

  4 #include<algorithm>

  5 #include<math.h>

  6 #include<iostream>

  7 #include<queue>

  8 using namespace std;

  9 const int maxn = 24;

 10 const int maxm = 5105;

 11 const int inf = 99999999;

 12 int n,m,c;

 13 int a[ maxn ];

 14 int vis[ maxm ];

 15 int flag;

 16 struct node{

 17     string ans;

 18     int mod;

 19 };

 20 string res;

 21 queue<node>q;

 22 void init2(){

 23     while( !q.empty() )

 24         q.pop();

 25 }

 26 void init1(){

 27     memset( a,0,sizeof( a ));

 28     memset( vis,0,sizeof( vis ));

 29     flag=-1;

 30     res.clear();

 31 }

 32 void bfs(){

 33     init2();

 34     node now,next;

 35     for( int i=1;i<16;i++ ){

 36         if( a[i] ){

 37             vis[ i%n ]=1;

 38             if( i>=0&&i<=9 ){

 39                 now.ans="";

 40                 now.ans=(i+'0');

 41                 now.mod=i%n;

 42                 q.push( now );

 43             }

 44             else{

 45                 now.ans="";

 46                 now.ans=(i+'A'-10);

 47                 now.mod=i%n;

 48                 q.push( now );

 49             }

 50         }

 51     }//the init

 52     while( !q.empty() ){

 53         now=q.front(),q.pop();

 54         if( flag==1&&now.ans.size()>res.size() )

 55             continue;

 56         if( now.mod==0 ){

 57             if( flag==-1 ){

 58                 flag=1;

 59                 res=now.ans;

 60             }

 61             else{

 62                 if( now.ans.size()<res.size() ){

 63                     res=now.ans;

 64                 }

 65                 else if( now.ans.size()==res.size()&&res>now.ans ){

 66                     res=now.ans;

 67                 }

 68             }

 69         }

 70         for( int i=0;i<16;i++ ){

 71             if( a[i] ){

 72                 if( i<10 ){

 73                     next=now;

 74                     next.ans+=( i+'0' );

 75                     next.mod=(now.mod*c+i)%n;

 76                     if( ( next.ans.size()<=500&&vis[ next.mod ]==0 )||( next.mod==0 ) ){

 77                         vis[ next.mod ]=1;

 78                         q.push( next );

 79                     }

 80                 }

 81                 else{

 82                     next=now;

 83                     next.ans+=(i+'A'-10);

 84                     next.mod=(now.mod*c+i)%n;

 85                     if( ( next.ans.size()<=500&&vis[ next.mod ]==0 )||( next.mod==0 ) ){

 86                         vis[ next.mod ]=1;

 87                         q.push( next );

 88                     }

 89                 }

 90             }

 91         }

 92     }

 93 }

 94 

 95 int main(){

 96     int ca;

 97     scanf("%d",&ca);

 98     while( ca-- ){

 99         scanf("%d%d%d",&n,&c,&m);

100         init1();

101         char ch[ 4 ];

102         for( int i=0;i<m;i++ ){

103             scanf("%s",ch);

104             if( ch[0]>='0'&&ch[0]<='9' )

105                 a[ ch[0]-'0' ]=1;

106             else

107                 a[ ch[0]-'A'+10 ]=1;

108         }

109          if(n==0){  

110            // cout<<0<<endl;  

111             if(a[0]==1)  

112                 cout<<0<<endl;  

113             else  

114                 cout<<"give me the bomb please"<<endl;  

115             continue;  

116         }  

117         bfs();

118         if( flag==-1 )

119             printf("give me the bomb please\n");

120         else

121             cout<<res<<endl;

122     }

123     return 0;

124 }

 

你可能感兴趣的:(程序设计)