2014-10-30 13:53:38
A:话不多,模拟。
1 /************************************************************************* 2 > File Name: a.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Wed 29 Oct 2014 11:05:04 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 27 int n,m; 28 int a[105]; 29 30 int main(){ 31 int x,y; 32 scanf("%d",&n); 33 for(int i = 1; i <= n; ++i) 34 scanf("%d",&a[i]); 35 scanf("%d",&m); 36 for(int i = 1; i <= m; ++i){ 37 scanf("%d%d",&x,&y); 38 if(x > 0) a[x - 1] += y - 1; 39 if(x < n) a[x + 1] += a[x] - y; 40 a[x] = 0; 41 } 42 for(int i = 1; i <= n; ++i) 43 printf("%d\n",a[i]); 44 return 0; 45 }
B:这题有点意思,由于书的厚度只有1和2两种,所以按1和2两种厚度分别存,然后分别按书我宽度(w)降序排序,暴力两层循环找最优解。
(一开始还逗比的想怎么贪心,哎,题目一定要看清,思路清楚后才敲,谨记)
1 /************************************************************************* 2 > File Name: b.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Wed 29 Oct 2014 11:11:41 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 27 int n,c1,c2; 28 int v1[105],v2[105]; 29 int s1[105],s2[105]; 30 31 bool cmp(int u,int v){ 32 return u > v; 33 } 34 35 int main(){ 36 c1 = c2 = 0; 37 int a,b; 38 scanf("%d",&n); 39 for(int i = 1; i <= n; ++i){ 40 scanf("%d%d",&a,&b); 41 if(a == 1) v1[++c1] = b; 42 else v2[++c2] = b; 43 } 44 sort(v1 + 1,v1 + c1 + 1,cmp); 45 sort(v2 + 1,v2 + c2 + 1,cmp); 46 s1[0] = s2[0] = 0; 47 int ans = INF; 48 for(int i = 1; i <= c1; ++i) s1[i] = s1[i - 1] + v1[i]; 49 for(int i = 1; i <= c2; ++i) s2[i] = s2[i - 1] + v2[i]; 50 for(int i = 0; i <= c1; ++i){ 51 for(int j = 0; j <= c2; ++j){ 52 if(i + 2 * j >= s1[c1] - s1[i] + s2[c2] - s2[j]){ 53 ans = min(ans,i + 2 * j); 54 break; 55 } 56 } 57 } 58 printf("%d\n",ans); 59 return 0; 60 }
C:挺好的一道数学题,考了许多细节。一共有n-m个灯等待去点,考虑简单情况:设某两盏开着的灯间有k个暗着的灯,那么易得方案数:2^(k - 1),可以这么想:在n-m步中选择k步去处理这两盏灯间的暗灯,所以这部分对答案的贡献:C(k,n - m) * 2^(k - 1),然后考虑每一对相邻的亮灯,最后处理一下开头和结尾即可。
这里复习了一下预处理组合数取模,另外要注意一个细节:如果两亮灯间没有暗灯的话要跳过去不然会造成答案为0的情况!
1 /************************************************************************* 2 > File Name: c.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Wed 29 Oct 2014 11:57:08 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 const int mod = 1000000007; 27 28 int n,m; 29 ll v[1010]; 30 ll c[1010][1010],fac[1010]; 31 ll ans; 32 33 void Pre(){ 34 for(int i = 1; i <= 1000; ++i){ 35 c[i - 1][0] = 1; 36 for(int j = 1; j <= i; ++j) 37 c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; 38 } 39 fac[0] = 1; 40 for(int i = 1; i <= 1000; ++i) 41 fac[i] = (fac[i - 1] * 2) % mod; 42 } 43 44 int main(){ 45 Pre(); 46 scanf("%d%d",&n,&m); 47 for(int i = 1; i <= m; ++i) 48 scanf("%I64d",v + i); 49 sort(v + 1,v + m + 1); 50 int sum = n - m; 51 if(sum == 0){ 52 printf("1\n"); 53 return 0; 54 } 55 ans = c[sum][v[1] - 1] % mod; 56 sum -= v[1] - 1; 57 for(int i = 1; i < m; ++i){ 58 int num = v[i + 1] - v[i] - 1; 59 if(num == 0) continue; 60 //ans = (ans * ((fac[num - 1] * c[sum][num]) % mod)) % mod; 61 ans = ((fac[num - 1] * c[sum][num]) % mod * ans) % mod; 62 sum -= num; 63 } 64 printf("%I64d\n",ans); 65 return 0; 66 }