CodeForces Round #106(Div.2)

这轮比赛做的比较快,rating上升少许
 
A题是排序和计算的问题。主人公的父母让他每个月都要浇花,并规定花必须长k厘米。然后输入12个数字,代表每个月花的成长高度。求出主人公至少要浇多少个月的花才能使花长高K厘米。
 
思路:将12个数据排序,从最大的开始相加,直到sum >=k
 

B题是进制换算和计算。给出0-9和A-Z的字符代表0-35的数字。在24小时和1小时=60分钟的时间制内求出所有满足输入数据的进制数。比如输入11:20. 换算成三进制就是4:6.换算成16进制就是17:32。都满足24小时和60分钟的时间制。本地需要注意的就是在使用进制换算的时候使用 pow函数,它的原型是
  double pow( double base, double exp );
头文件为     math.h
 
返回值为double 。 在进制转换的时候很多人用一个 int temp = a[j]*pow(n,i); 来存储数据
这样会导致精度损失,然后输出有问题。
 

C题,把n个人分成人数和实力都相对均衡的两队x,y. 
 
条件 |x-y|<=1 |sumSkillx - sumSkillY| < skillOfBestPlayer
 
可以用DP,也可以用数学方法。
 
因为测试数据都保证有结果,所以将编号为奇数的分到1个队,偶数的分到另一个队即可
 

D和E还无能为力。

 
 
A题代码:
View Code
 1 #include<stdio.h>
2 #include<algorithm>
3 #include<vector>
4 using namespace std;
5 int main()
6 {
7 vector<int> month;
8 int k,a,i,min=0,sum = 0;
9 scanf("%d",&k);
10 for(i = 0; i < 12; i++)
11 {
12 scanf("%d",&a);
13 month.push_back(a);
14 }
15 if(k == 0)
16 {
17 printf("0\n");
18 return 0;
19 }
20 sort(month.begin(),month.end());
21 for(i = 11; i >= 0; i--)
22 {
23 sum += month[i];
24 min++;
25 if(sum >= k)
26 break;
27 }
28 if(sum < k)
29 min = -1;
30 printf("%d\n",min);
31 return 0;
32 }
 
B题代码
View Code
  1 #include<iostream>
2 #include<string>
3 #include<vector>
4 #include<cmath>
5 using namespace std;
6
7 int main()
8 {
9 int flag1 = 0,flag2 = 0,j = 0, k = 0,ma = 0,end = 0;
10 int a[5],b[5],i;
11 vector<int> ans;
12 string s;
13 cin>>s;
14 int lenth = s.size();
15 for(i = 0; s[i] != ':'; i++)
16 {
17 if(flag1 == 0)
18 {
19 if(s[i] != '0')
20 {
21 flag1 = 1;
22 if( s[i] <= '9' && s[i] >= '0')
23 a[j++] = s[i] - '0';
24 else
25 a[j++] = s[i] - 'A' + 10;
26 if(a[j-1] != 0)
27 ma = max(a[j-1],ma);
28 }
29 }
30 else
31 {
32 if( s[i] <= '9' && s[i] >= '0')
33 a[j++] = s[i] - '0';
34 else
35 a[j++] = s[i] - 'A' + 10;
36 if(a[j-1] != 0)
37 ma = max(a[j-1],ma);
38 }
39 }
40 i++;
41 for(; i < lenth; i++)
42 {
43 if(flag2 == 0)
44 {
45 if(s[i] != '0')
46 {
47 flag2 = 1;
48 if( s[i] <= '9' && s[i] >= '0')
49 b[k++] = s[i] - '0';
50 else
51 b[k++] = s[i] - 'A' + 10;
52 if(b[k-1] != 0)
53 ma = max(b[k-1],ma);
54 }
55 }
56 else
57 {
58 if( s[i] <= '9' && s[i] >= '0')
59 b[k++] = s[i] - '0';
60 else
61 b[k++] = s[i] - 'A' + 10;
62 if(b[k-1] != 0)
63 ma = max(b[k-1],ma);
64 }
65 }
66 if(j <= 1 && k <= 1)
67 {
68 if(a[0] <= 23 || j == 0)
69 {
70 cout<<"-1"<<endl;
71 return 0;
72 }
73 }
74 for(i = ma + 1; ; i++)
75 {
76 double temp = 0;
77 for(int l = 0; l < j ; l++)
78 {
79 temp += a[l]*pow((double)i,j-l-1);
80 }
81 if(temp > 23)
82 break;
83 temp = 0;
84 for(int l = 0; l < k ; l++)
85 {
86 temp += b[l]*pow((double)i,k-l-1);
87 }
88 if(temp > 59)
89 break;
90 end = i;
91 }
92 if(end == 0)
93 cout<<"0"<<endl;
94 else
95 {
96 for(i = ma + 1; i <= end; i++)
97 cout<<i<<" ";
98 cout<<endl;
99 }
100 return 0;
101 }
 
C题代码
View Code
 1 # include <iostream>
2 # include <algorithm>
3 # include <vector>
4 # define PII pair<int,int>
5 using namespace std;
6 const int MAX_N=100*1000+100;
7 int N;
8 PII p[MAX_N];
9 vector<int> team1;
10 vector<int> team2;
11 int main()
12 {
13 ios::sync_with_stdio(false);
14 cin >> N;
15 for(int i=0;i<N;i++)
16 {
17 int temp;
18 cin >> temp;
19 p[i]=make_pair(temp,i+1);
20 }
21 sort(p,p+N);
22 reverse(p,p+N);
23 for(int i=0;i<N;i++)
24 {
25 int id=p[i].second;
26 if(i%2==0)
27 team1.push_back(id);
28 else
29 team2.push_back(id);
30 }
31 cout << (int)team1.size()<<endl;
32 for(int i=0;i<(int)team1.size();i++)
33 cout <<team1[i]<<" ";
34 cout << endl;
35 cout << (int)team2.size()<<endl;
36 for(int i=0;i<(int)team2.size();i++)
37 cout <<team2[i]<<" ";
38 cout << endl;
39 return 0;
40 }





posted on 2012-02-11 21:46  genslow  阅读(186)  评论(0编辑  收藏  举报