[关闭]
@AlanWong 2016-12-08T16:47:36.000000Z 字数 10922 阅读 719

第一次作业


题目链接

A.Design Tutorial: Learn from Math
题意:

给出一个整数n,12 ≤ n ≤ 1e6,输出两个合数a和b,使a+b=n。

思路:

这题很水,既然最小值为12,那么就对n分奇偶讨论,若为偶数,则n-4一定也是偶数,所以输出4和n-4;若为奇数,那么n-9一定是大于2的偶数,输出9和n-9。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1000000007;
  26. int main()
  27. {
  28. //freopen("in.txt","r",stdin);
  29. //freopen("out.txt","w",stdout);
  30. int n;
  31. while(~scanf("%d", &n)){
  32. if(n%2) printf("%d 9\n", n-9);
  33. else printf("%d 4\n", n-4);
  34. }
  35. return 0;
  36. }

B.Design Tutorial: Learn from Life
题意:

n个人在一楼,一个最大载k人的电梯将他们载到他们要去的楼层,上下电梯时间忽略不计,运行时间为楼层差。问将他们全部送到指定楼层要多久。

思路:

这题很水,先排序,从高往低送,纯模拟。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1000000007;
  26. int n, k, ans;
  27. int arr[2005];
  28. int main()
  29. {
  30. //freopen("in.txt","r",stdin);
  31. //freopen("out.txt","w",stdout);
  32. scanf("%d %d", &n, &k);
  33. for(int i=0; i<n; i++)
  34. scanf("%d", &arr[i]);
  35. sort(arr, arr+n);
  36. n--;
  37. while(n>=0){
  38. ans+=2*(arr[n]-1);
  39. n-=k;
  40. }
  41. printf("%d\n", ans);
  42. return 0;
  43. }

C.Design Tutorial: Make It Nondeterministic
题意:

n个人用自己的姓氏或名字作为自己用户名,若按照字典序排序,是否有一种方案使这些人按照给出顺序排序。

思路:

这题难点应该在读题,给出的数列的每一位Pi指的是名字原来所在的位置现在排在i位。设置中间string变量s记录上一个选择的名字,然后按之前记录位置的pos数组依次遍历当前的名字能否满足字典序大于s,优先选择字典序小的名字来判断,任一不满足的循环节即跳出。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1000000007;
  26. int N;
  27. struct node
  28. {
  29. string fn, ln;
  30. }name[100005];
  31. string s;
  32. int pos[100005];
  33. int main()
  34. {
  35. //freopen("in.txt","r",stdin);
  36. //freopen("out.txt","w",stdout);
  37. cin>>N;
  38. for(int i=1; i<=N; i++){
  39. cin>>name[i].fn>>name[i].ln;
  40. if(name[i].fn>name[i].ln) swap(name[i].fn, name[i].ln);
  41. }
  42. for(int i=1; i<=N; i++)
  43. cin>>pos[i];
  44. bool flag=true;
  45. for(int i=1; i<=N; i++){
  46. int cur=pos[i];
  47. if(s<name[cur].fn){
  48. s=name[cur].fn;
  49. continue;
  50. }
  51. if(s<name[cur].ln){
  52. s=name[cur].ln;
  53. continue;
  54. }
  55. flag=false;
  56. break;
  57. }
  58. if(flag) cout<<"YES"<<endl;
  59. else cout<<"NO"<<endl;
  60. return 0;
  61. }

E.MUH and Sticks
题意:

给出六个棍子的长度,如果四个等长,剩下两个长度不等为Bear,相等为Elephant,否则为Alien。

思路:

这题很水,直接上代码。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1000000007;
  26. int arr[20];
  27. int len, flag;
  28. bool cmp(int a, int b)
  29. {
  30. return a>b;
  31. }
  32. int main()
  33. {
  34. //freopen("in.txt","r",stdin);
  35. //freopen("out.txt","w",stdout);
  36. for(int i=0; i<6; i++){
  37. cin>>len;
  38. arr[len]++;
  39. }
  40. sort(arr, arr+10, cmp);
  41. if(arr[0]==4){
  42. if(arr[1]==1) cout<<"Bear"<<endl;
  43. else cout<<"Elephant"<<endl;
  44. }
  45. else if(arr[0]==5) cout<<"Bear"<<endl;
  46. else if(arr[0]==6) cout<<"Elephant"<<endl;
  47. else cout<<"Alien"<<endl;
  48. return 0;
  49. }

F.MUH and Important Things
题意:

给出长度为n的数列,问能否有三种以上的非递减排序,有,输出“YES”并输入任意三种满足要求的不同排列;没有输出“NO”。

思路:

分情况,若有三个相同数字或者两对分别相同的数字即满足条件,暴力遍历打印呗。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=2005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. int n;
  27. int now, pp[2];
  28. struct node
  29. {
  30. int p, pos;
  31. }num[MAXN];
  32. bool cmp(node a, node b)
  33. {
  34. return a.p<b.p;
  35. }
  36. void swp(node &a, node &b)
  37. {
  38. node t;
  39. t.p=a.p;
  40. t.pos=a.pos;
  41. a.p=b.p;
  42. a.pos=b.pos;
  43. b.p=t.p;
  44. b.pos=t.pos;
  45. }
  46. void prt()
  47. {
  48. cout<<num[1].pos;
  49. for(int i=2; i<=n; i++){
  50. cout<<' '<<num[i].pos;
  51. }
  52. cout<<endl;
  53. }
  54. int main()
  55. {
  56. //freopen("in.txt","r",stdin);
  57. //freopen("out.txt","w",stdout);
  58. cin>>n;
  59. for(int i=1; i<=n; i++){
  60. cin>>num[i].p;
  61. num[i].pos=i;
  62. }
  63. sort(num+1, num+n+1, cmp);
  64. bool flag=false;
  65. for(int i=n; i>2; i--){
  66. if(num[i].p==num[i-1].p && num[i-1].p==num[i-2].p){
  67. cout<<"YES\n";
  68. prt();
  69. swp(num[i], num[i-1]);
  70. prt();
  71. swp(num[i], num[i-2]);
  72. prt();
  73. return 0;
  74. }
  75. else if(num[i].p==num[i-1].p){
  76. pp[now++]=i;
  77. if(flag) break;
  78. flag=true;
  79. }
  80. }
  81. if(pp[0] && num[2].p==num[1].p){
  82. pp[1]=2;
  83. }
  84. if(pp[1]){
  85. cout<<"YES\n";
  86. prt();
  87. swp(num[pp[0]], num[pp[0]-1]);
  88. prt();
  89. swp(num[pp[1]], num[pp[1]-1]);
  90. prt();
  91. }
  92. else{
  93. cout<<"NO\n";
  94. }
  95. return 0;
  96. }

G.MUH and House of Cards
题意:

用恰好n(1<=n<=10^12)张卡片搭建一个房子,问能搭建多少种不同的高度的房子。
搭建的房子满足以下要求:
1.每一层的房子数要多于他上面那层的房子数。
2.同一层的房子必须是连续的。
3.大于两间的房子要有天花板。

思路:

找规律撒,每行去掉两个就能整除3。从第一层网上遍历跑呗,用t记录加1层至少要多少建材。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. ll N, ans;
  27. int main()
  28. {
  29. //freopen("in.txt","r",stdin);
  30. //freopen("out.txt","w",stdout);
  31. cin>>N;
  32. for(ll i=2, t=2; t<=N; i++){
  33. if((N-t)%3==0) ans++;
  34. t=i*(3*i+1)/2;
  35. }
  36. cout<<ans<<endl;
  37. return 0;
  38. }

I.George and Accommodation
题意:

给定n(1<=n<=100),n个房间的容量q和已入住人数p(0<=pi<=qi<=100),问有多少个房间能满足两人围炉夜话,深夜交♂流哲♂学的愿望。

思路:

一个房间一个房间考察清楚呗,然后嘿嘿嘿。。。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. int n;
  27. int p, q;
  28. int ans;
  29. int main()
  30. {
  31. //freopen("in.txt","r",stdin);
  32. //freopen("out.txt","w",stdout);
  33. cin>>n;
  34. while(n--){
  35. cin>>p>>q;
  36. if(q-p>1) ans++;
  37. }
  38. cout<<ans<<endl;
  39. return 0;
  40. }

J.Fedor and New Game
题意:

给定m(1<=m<=1000)和n(1<=n<=20),给定m个整数x(0<=xi<=2^n-1)描述了m个玩家的兵种情况,给定一个整数X描述了主人公的兵种情况。
兵种情况的描述方式:以二进制考虑,第0到第n-1位分别表示该玩家是否拥有当前兵种。
给定k(1<=k<=n),当两名玩家的兵种情况的差异不超过k,这两名玩家可以成为好朋友。问主人公可以和多少名玩家成为好朋友。

思路:

两层循环暴力跑呗,判断可以用位运算比较每一位是否相同。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. int n, m, k, flag, now, ans;
  27. int num[1005];
  28. int main()
  29. {
  30. //freopen("in.txt","r",stdin);
  31. //freopen("out.txt","w",stdout);
  32. cin>>n>>m>>k;
  33. for(int i=0; i<m; i++)
  34. cin>>num[i];
  35. cin>>flag;
  36. for(int i=0; i<m; i++){
  37. now=0;
  38. for(int j=0; j<n; j++)
  39. if((num[i]&(1<<j)) != (flag&(1<<j))) now++;
  40. if(now<=k) ans++;
  41. }
  42. cout<<ans<<endl;
  43. return 0;
  44. }

K.George and Job
题意:

给定一个长度为n的整数序列p,给m和k让你在序列p中选择不重合的m段长度为k的子段,求这m*k个数的和的最大值。

思路:

DP,最怕DP,看了题解才会做。用一个sum[i]数组存前i项的和。二维DP数组dp[i][j]表示前i位,选择j段的最大的和。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=500005;
  24. const int INF=0x3f3f3f3f;
  25. const ll INFLL=9223372036854775807;
  26. const int MOD=1e9+7;
  27. int n, m, k;
  28. ll a[5005], sum[5005], dp[5005][5005];
  29. ll ans;
  30. int main()
  31. {
  32. //freopen("in.txt","r",stdin);
  33. //freopen("out.txt","w",stdout);
  34. cin>>n>>m>>k;
  35. for(int i=1; i<=n; i++){
  36. cin>>a[i];
  37. sum[i]=sum[i-1]+a[i];
  38. }
  39. for(int i=m; i<=n; i++){
  40. for(int j=1; j<=k; j++)
  41. dp[i][j]=max(dp[i-1][j], dp[i-m][j-1]+sum[i]-sum[i-m]);
  42. ans=max(ans, dp[i][k]);
  43. }
  44. cout<<ans<<endl;
  45. return 0;
  46. }

M.Cheap Travel
题意:

要坐n次地铁,有单程票,票价为a,有能用m次的通票,票价为b。给你n,m,a,b。求最少花多少钱。

思路:

考虑周全点,算一下呗。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. int n, m, a, b;
  27. int main()
  28. {
  29. //freopen("in.txt","r",stdin);
  30. //freopen("out.txt","w",stdout);
  31. cin>>n>>m>>a>>b;
  32. if(m*a>b) cout<<min((n%m)*a+(n/m)*b, (n/m+1)*b)<<endl;
  33. else cout<<n*a<<endl;
  34. return 0;
  35. }

N.Wonder Room
题意:

n个人住房子,每个人需要面积为6,给你已有的边长为a和b的矩形房间,问你怎样扩建a和b,使面积能住下n个人且尽可能小。a,b均为正整数。
输出最小面积和此时a和b的值。

思路:

暴力枚举,跑到(6n)^0.5即可。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=100005;
  24. const int INF=0x3f3f3f3f;
  25. const int MOD=1e9+7;
  26. ll n, a, b, s, lim, ms, ma, mb;
  27. bool flag;
  28. int main()
  29. {
  30. //freopen("in.txt","r",stdin);
  31. //freopen("out.txt","w",stdout);
  32. ms=9223372036854775807;
  33. cin>>n>>a>>b;
  34. n*=6;
  35. if(a*b>=n){
  36. cout<<a*b<<endl;
  37. cout<<a<<' '<<b<<endl;
  38. return 0;
  39. }
  40. lim=(ll)(sqrt(n)+1);
  41. if(a>b){
  42. flag=true;
  43. swap(a, b);
  44. }
  45. for(ll i=a; i<lim; i++){
  46. s=n/i;
  47. if(n%i) s++;
  48. if(s<b) break;
  49. s*=i;
  50. if(s<ms){
  51. ms=s;
  52. ma=i;
  53. mb=s/i;
  54. }
  55. }
  56. if(flag) swap(ma, mb);
  57. cout<<ms<<endl;
  58. cout<<ma<<' '<<mb<<endl;
  59. return 0;
  60. }

O.Number of Ways
题意:

给出一个n长度序列,问多少种方法使得这个n长度序列分成3份,每一份值都相同

思路:

遍历一遍,找1/3处和2/3处,找到1/3处就cnt1++,找到2/3处就cnt2++。最后cnt2就是答案。

代码:

  1. #include <bits/stdc++.h>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <utility>
  8. #include <sstream>
  9. #include <complex>
  10. #include <cstdio>
  11. #include <bitset>
  12. #include <vector>
  13. #include <cmath>
  14. #include <queue>
  15. #include <stack>
  16. #include <ctime>
  17. #include <list>
  18. #include <set>
  19. #include <map>
  20. using namespace std;
  21. #define ll long long
  22. #define ull unsigned long long
  23. const int MAXN=500005;
  24. const int INF=0x3f3f3f3f;
  25. const ll INFLL=9223372036854775807;
  26. const int MOD=1e9+7;
  27. ll arr[MAXN], sum;
  28. ll n, t, cnt1, cnt2;
  29. int main()
  30. {
  31. //freopen("in.txt","r",stdin);
  32. //freopen("out.txt","w",stdout);
  33. cin>>n;
  34. for(int i=0; i<n; i++){
  35. cin>>t;
  36. sum+=t;
  37. arr[i]=sum;
  38. }
  39. if(arr[0]*3==sum) cnt1++;
  40. n--;
  41. for(int i=1; i<n; i++){
  42. if(arr[i]*3==2*sum) cnt2+=cnt1;
  43. if(arr[i]*3==sum) cnt1++;
  44. }
  45. cout<<cnt2<<endl;
  46. return 0;
  47. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注