1. 程式人生 > >【補題】組隊訓練第二場 & 個人訓練第一場

【補題】組隊訓練第二場 & 個人訓練第一場

for 分享 貪心 n) nbsp true open tput stdin

組隊第二場:

C題 CodeForces Gym 100735D

題意:給你N個木棍,問他們能拼成多少個三角形。

思路:從小到大排序,然後貪心地去取。

技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<set>
 8 #include<string>
 9 #include<sstream>
10
#include<cctype> 11 #include<map> 12 #include<stack> 13 #include<queue> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16 int gcd(int a, int b){return b==0?a:gcd(b,a%b);} 17 18 long long s[20]; 19 bool use[20]; 20 int ans = 0, N; 21 22 int main() 23 { 24 // freopen("input.txt", "r", stdin);
25 // freopen("output.txt", "w", stdout); 26 memset(use, false, sizeof(use)); 27 scanf("%d", &N); 28 for(int i = 0; i < N; i++) 29 scanf("%I64d", &s[i]); 30 sort(s, s + N); 31 for(int i = 0; i < N; i++) 32 { 33 if(use[i]) continue; 34 for
(int j = i + 1; j < N; j++) 35 { 36 if(use[i]) break; 37 if(use[j]) continue; 38 for(int k = j + 1; k < N; k++) 39 { 40 if(use[k]) continue; 41 if(s[i] + s[j] > s[k]) 42 { 43 ans++; 44 use[i] = use[j] = use[k] = true; 45 break; 46 } 47 else break; 48 } 49 } 50 } 51 printf("%d\n", ans); 52 return 0; 53 }
View Code

個人第一場:

I題 HDU 5742 乍一看題目不太想看,看到很多人AC了才發現是一道水題,果然英文是個大問題。

題意:給你n個數,已知了m個數,求(a1 + a2) / (a1 + a2 + ... + an)的最大值。

思路:除了a1, a2外,從後往前掃一遍賦最小的值就行了。可以不用結構體的,我寫煩了。

技術分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<set>
 8 #include<string>
 9 #include<sstream>
10 #include<cctype>
11 #include<map> 
12 #include<stack>
13 #include<queue>
14 using namespace std;
15 #define INF 0x3f3f3f3f
16 typedef long long ll;
17 int gcd(int a, int b){return b==0?a:gcd(b,a%b);} 
18 
19 struct Node{
20     int num;
21     int flag;
22 }node[105];
23 
24 int main()
25 {
26 //    freopen("input.txt", "r", stdin);
27 //    freopen("output.txt", "w", stdout);
28     int T, n, m, x, y, p, q, k;
29     scanf("%d", &T);
30     while(T--){
31         p = q = k = 0;
32         scanf("%d%d", &n, &m);
33         for(int i = 1; i <= n; i++){
34             node[i].num = 0;
35             node[i].flag = 0;
36         }
37         while(m--){
38             scanf("%d%d", &x, &y);
39             node[x].num = y;
40             node[x].flag = 1;
41         }
42         for(int i = n; i >= 3; i--){
43             if(node[i].flag)    k = node[i].num;
44             else    node[i].num = k;
45         }
46         if(!node[1].flag){
47             node[1].num = 100;
48             if(!node[2].flag)
49                 node[2].num = 100;
50         }
51         else if(!node[2].num)
52             node[2].num = node[1].num;
53         p = node[1].num + node[2].num;
54         for(int i = 1; i <= n; i++)
55             q += node[i].num;
56         int mode = gcd(p, q);
57         printf("%d/%d\n", p / mode, q / mode);
58     }
59     return 0; 
60 }
View Code

依舊是兩道水題啊~~~

【補題】組隊訓練第二場 & 個人訓練第一場