Codeforces Round #313 (Div. 2)
A. Currency System in Geraldion
题目描述,有n种纸币,每种有无数张,问最小不能组成的和是多少?
解题思路:
只需要在[1,max(纸币面额)]区间内找就好了,大于max(纸币面额)的和都可以通过[1,max(纸币面额)]内的数经过运算得到,两重循环一下就好了,简单的完全背包问题。
当然啦,这是最实在的做法,做codeforces脑洞开的一定要大,贴两个代码:
1 #include <cstdio>//完全背包 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long LL; 8 const int maxn = 1002; 9 int dp[maxn*maxn], a[maxn]; 10 int main () 11 { 12 int n, i, j; 13 while (scanf ("%d", &n) != EOF) 14 { 15 for (i=0; i<n; i++) 16 scanf ("%d", &a[i]); 17 sort (a, a+n); 18 memset (dp, 0, sizeof(dp)); 19 dp[0] = 1; 20 for (i=0; i<n-1; i++) 21 for (j=a[i]; j<a[n-1]; j++) 22 dp[j] = max (dp[j], dp[j-a[i]]); 23 for (i=1; i<a[n-1]; i++) 24 if (!dp[i]) 25 break; 26 if (i < a[n-1]) 27 printf ("%d\n", i); 28 else 29 printf ("-1\n"); 30 } 31 return 0; 32 }
1 /*有1的话,任何数都可以组合到,没有1的话,任何数都组合不出1*/ 2 #include <bits/stdc++.h> 3 using namespace std; 4 int main () 5 { 6 int n, m, num; 7 while (scanf("%d", &n) != EOF) 8 { 9 m = 10; 10 while (n --) 11 { 12 scanf ("%d", &num); 13 m = min (m, num); 14 } 15 printf ("%d\n", m==1?-1:1); 16 } 17 return 0; 18 }
题目描述:
有一个x*y的矩形,是否可以装的下a1*b1,a2*b2两个矩形,两个矩形不可以重合,不可以折叠,但是可以接触。
解题思路:
暴力判定一下就ok了,在这里函数提高代码的利用率真的表现的很明显~~
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long LL; 8 const int maxn = 1002; 9 int x, y, a1, b1, a2, b2; 10 int solve () 11 { 12 int a, b; 13 a = a1 + a2; 14 b = max (b1, b2); 15 if (a<=x && b<=y || a<=y && b<=x) 16 return 1; 17 b = b1 + b2; 18 a = max (a1, a2); 19 if (a<=x && b<=y || a<=y && b<=x) 20 return 1; 21 return 0; 22 } 23 int main () 24 { 25 while (scanf ("%d %d", &x, &y) != EOF) 26 { 27 scanf ("%d %d", &a1, &b1); 28 scanf ("%d %d", &a2, &b2); 29 if (solve()) 30 { 31 printf ("YES\n"); 32 continue; 33 } 34 swap (a1, b1); 35 if (solve()) 36 { 37 printf ("YES\n"); 38 continue; 39 } 40 swap (a2, b2); 41 if (solve()) 42 { 43 printf ("YES\n"); 44 continue; 45 } 46 printf ("NO\n"); 47 } 48 return 0; 49 }
题目描述:
给出一个六边形,六边形的6个内角都是120°,给出6个边的长度,问这个六边形可以分成几个边长为1的等边三角形?
解题思路:
直接求出面积就好咯,因为分成的是边长为1的的等边三角形,所以求面积的时候就更加简单了一点呢,具体看代码实现。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 10; 7 int main () 8 { 9 int a[maxn], sum; 10 for (int i=0; i<6; i++) 11 scanf ("%d", &a[i]); 12 sum = (a[0]+a[1]+a[2]); 13 sum = sum *sum - a[0]*a[0] - a[2]*a[2] - a[4]*a[4]; 14 printf ("%d\n", sum); 15 return 0; 16 }
题目描述:
判断字符串a,b是否相等,相等的条件(满足其一)是:
1:a == b
2:strlen(a),strlen(b)同时为偶数并且相等的时候分别把a,b等分为a1,a2,b1,b2。当子串满足下面任意一个条件的时候,a == b
(1):a1 == b1 && a2 == b2
(2):a2 == b1 && a1 == b2
1 //codeforcesD 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 200005; 8 char a[maxn], b[maxn]; 9 bool dfs (int la, int ra, int lb, int rb) 10 { 11 int i, j; 12 for (i=la, j=lb; i<ra; i++, j++) 13 if (a[i] != b[j]) 14 break; 15 if (i == ra) 16 return 1; 17 if ((ra - la) % 2) 18 return 0; 19 i = (ra - la) / 2; 20 if ((dfs(la,la+i,lb+i,rb)&&dfs(la+i,ra,lb,lb+i)) || (dfs(la,la+i,lb,lb+i)&&dfs(la+i,ra,lb+i,rb))) 21 return 1; 22 } 23 int main () 24 { 25 while (scanf ("%s %s", a, b) != EOF) 26 { 27 int len = strlen (a); 28 if (dfs (0, len, 0, len)) 29 printf ("YES\n"); 30 else 31 printf ("NO\n"); 32 } 33 return 0; 34 }
本文为博主原创文章,未经博主允许不得转载。