AtCoder Beginner Contest 057

A题

分析:24进制转换

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a,b;
 6     while(cin>>a>>b){
 7         cout<<(a+b)%24<<endl;
 8     }
 9     return 0;
10 }
View Code

B题

分析:求曼哈顿距离最近的点

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 using namespace std;
 7 const int maxn=50+10;
 8 const long long INF=500000001;
 9 int n,m;
10 int vis[maxn];
11 typedef struct 
12 {
13     long long  x,y;
14 }point;
15 typedef struct{
16     long long x,y;
17     int num;
18 }fun;
19 point p[maxn];
20 fun s[maxn];
21 int main()
22 {
23     while(cin>>n>>m)
24     {
25         memset(vis,0,sizeof(vis));
26         for(int i=1;i<=n;i++)
27             scanf("%lld%lld",&p[i].x,&p[i].y);
28         for(int i=1;i<=m;i++){
29             scanf("%lld%lld",&s[i].x,&s[i].y);
30             s[i].num=i;
31         }
32         for(int i=1;i<=n;i++){
33             long long minx=INF;
34             int k=0;
35             for(int j=1;j<=m;j++){
36                 long long t=abs(p[i].x-s[j].x)+abs(p[i].y-s[j].y);
37                 if(t<minx){
38                     minx=t;
39                     k=j;
40                 }
41             }
42             printf("%d\n",k);
43         }
44     }
45     return 0;
46 }
View Code

C题

分析:求所有两个相乘为N的数的最大位数的最小值

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cmath"
 4 using namespace std;
 5 const int INF=50;
 6 long long n;
 7 int solve(long long num){
 8     int cnt=0;
 9     while(num){
10         cnt++;
11         num/=10;
12     }
13     return cnt;
14 }
15 int main()
16 {
17     while(cin>>n){
18         long long minx=INF;
19         //cout<<solve(10000)<<endl;
20         for(long long i=1;i*i<=n;i++){
21             if(n%i==0){
22                 long long t=max(solve(i),solve(n/i));
23                 minx=min(minx,t);
24             }
25         }
26         cout<<minx<<endl;
27     }
28 }
View Code

D题

分析:首先我们按照从大到小进行排序,然后选取前a个,这样得出来的平均值一定是最大的。然后接着我们统计总共有多少个跟a相同的数,并统计在第a个数之前有多少个跟a相同的数,如果第1个数个数跟第a个相同,则为c[x][y],否则我们统计从a到b的组合数相加.注意求组合数的方法,很经典。

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 #include "algorithm"
 7 #include "map"
 8 #include "set"
 9 #include "vector"
10 #define eps 1e-6
11 using namespace std;
12 const int maxn=55;
13 double s[maxn];
14 long long c[maxn][maxn];
15 int n,a,b;
16 bool cmp(double x,double y){
17     return x>y;
18 }
19 void init(){
20     c[0][0]=1;
21     for(int i=1;i<=n;i++){
22         c[i][0]=1,c[i][i]=1;
23         for(int j=1;j<i;j++)
24             c[i][j]=c[i-1][j-1]+c[i-1][j];
25     }
26 }
27 int main()
28 {
29     while(cin>>n>>a>>b){
30         init();
31         for(int i=0;i<n;i++)
32             cin>>s[i];
33         sort(s,s+n,cmp);
34         double sum=0;
35         for(int i=0;i<a;i++){
36             sum+=s[i];
37         }
38         double h=sum/(double)a;
39         int x=0,y=0;
40         for(int i=0;i<n;i++)
41             if(s[i]==s[a-1]){
42                 x++;
43                 if(i<a)
44                     y++;
45             }
46         //cout<<x<<" "<<y<<endl;
47         printf("%.6f\n",h);
48         if(s[0]!=s[a-1]){
49             cout<<c[x][y]<<endl;
50         }else{
51             long long cnt=0;
52             for(int i=a;i<=min(b,x);i++)
53                 cnt+=c[x][i];
54             cout<<cnt<<endl;
55         }
56         //printf("%d\n",ans);
57     }
58     return 0;
59 }
View Code
posted @ 2017-03-28 15:22  wolf940509  阅读(173)  评论(0)    收藏  举报