【補題】組隊訓練第二場 & 個人訓練第一場
阿新 • • 發佈:2017-08-02
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> 10View Code#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 }
個人第一場:
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
依舊是兩道水題啊~~~
【補題】組隊訓練第二場 & 個人訓練第一場