组队第二场:
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 }
个人第一场:
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 }
依旧是两道水题啊~~~
时间: 2024-11-05 23:41:06