[关闭]
@Asuna 2016-12-08T15:26:07.000000Z 字数 5751 阅读 719

第一次集训队作业

题解

ProblemA: Design Tutorial: Learn from Math

题意:把一个数拆分为两个合数

题解:枚举并且得到的i和n-i分别check是否是合数,模拟即可。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. int n;
  8. bool check(int n)
  9. {
  10. for (int i=2; i*i<=n; i++)
  11. if(n%i==0) return true;
  12. return false;
  13. }
  14. int main()
  15. {
  16. cin>>n;
  17. for(int i=4; i<=n/2; i++)
  18. {
  19. if(check(i) && check(n-i))
  20. {
  21. cout<<i<<" "<<n-i<<endl;
  22. break;
  23. }
  24. }
  25. return 0;
  26. }

ProblemB:Design Tutorial: Learn from Life

题意:有n个人要到不同楼层去,但电梯只能装下K个人,不计上下的时间,问最少需要多少时间所有人可以达到自己的楼层。

题解:贪心,先将最高层的人运输完成,再运输下一层的人。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<cstdlib>
  7. using namespace std;
  8. int a[2002],ans,n,k;
  9. int main()
  10. {
  11. cin>>n>>k;
  12. for(int i=1; i<=n; i++) cin>>a[i];
  13. sort(a+1,a+n+1);
  14. for(int i=n; i>=1; i-=k)
  15. {
  16. ans+=2*(a[i]-1);
  17. }
  18. cout<<ans<<endl;
  19. return 0;
  20. }

ProbelmC:Design Tutorial: Make It Nondeterministic

题意:每一个人都有frist name 和 last name。 从每一个人的名字中任意选择first name 或者 last name 作为这个人的编号,通过对编号的排序,得到每一个人的最终顺序,比较中的序列能否得到给定输出的序列一致。

题解:对输入的每个人的名字字符串排序。看看每个人排序后的number是不是和给出的相同。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<string>
  6. #include<cmath>
  7. using namespace std;
  8. string s1[100005],s2[100005],st;
  9. int p[100005],n,x;
  10. int main()
  11. {
  12. cin>>n;
  13. for (int i=1; i<=n; i++)
  14. cin>>s1[i]>>s2[i];
  15. for (int i=1; i<=n; i++)
  16. cin>>p[i];
  17. for(int i=1; i<=n; i++)
  18. {
  19. x=p[i];
  20. if (s1[x]>s2[x]) swap(s1[x],s2[x]);
  21. if (st<s1[x]) st=s1[x];
  22. else if (st<s2[x]) st=s2[x];
  23. else
  24. {
  25. cout<<"NO"<<endl;
  26. return 0;
  27. }
  28. }
  29. cout<<"YES "<<endl;
  30. return 0;
  31. }

ProblemD:留坑

ProblemE:MUH and Sticks

题意:给出6种长度的木棍,问能根据长度拼成哪种动物的形状。其中由脚、头和身体构成。脚为4个一样的长度,如果头和身体长度一样为大象,不一样为熊。否则为异形。

题解:判断棍子的长度,考虑是否有四根一样长的棍子,然后再判断剩下的棍子长度情况。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int a[105],l,sum1,sum2;
  6. int main()
  7. {
  8. for (int i=1; i<=6; i++)
  9. {
  10. cin>>l;
  11. a[l]++;
  12. if (a[l]==4) sum1=1;
  13. if (a[l]==6) sum2=1;
  14. }
  15. //cout<<sum1<<" "<<sum2<<endl;
  16. for (int i=1; i<10; i++)
  17. if (a[i]==2) sum2=1;
  18. if (sum1 && sum2) cout<<"Elephant"<<endl;
  19. else if (sum1 && !sum2) cout<<"Bear"<<endl;
  20. else cout<<"Alien"<<endl;
  21. return 0;
  22. }

ProblemF:MUH and Important Things

题意:n个问题,每个问题都有对应的难度,求至少三个不同的序列使得做题的难度是非递减的。

题解:找到一个序列,然后组合。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. struct node
  9. {
  10. int x,rank;
  11. }a[10005];
  12. int n,sum=1,t,j;
  13. bool bo;
  14. bool cmp(node a,node b)
  15. {
  16. return a.x<b.x;
  17. }
  18. int main()
  19. {
  20. cin>>n;
  21. for (int i=1; i<=n; i++)
  22. {
  23. cin>>a[i].x;
  24. a[i].rank=i;
  25. }
  26. sort(a+1,a+n+1,cmp);
  27. t=1;
  28. for (int i=2; i<=n; i++)
  29. {
  30. if (a[i].x==a[i-1].x) t++;
  31. else
  32. {
  33. sum*=t;
  34. t=1;
  35. }
  36. if (sum>=3)
  37. {
  38. bo=1;
  39. break;
  40. }
  41. }
  42. sum*=t;
  43. if (sum>=3) bo=1;
  44. if (!bo) cout<<"NO"<<endl;
  45. else
  46. {
  47. cout<<"YES"<<endl;
  48. for (int i=1; i<=n; i++) cout<<a[i].rank<<" ";
  49. cout<<endl;
  50. for (j=2; j<=n; j++)
  51. if (a[j].x==a[j-1].x)
  52. {
  53. swap(a[j],a[j-1]);
  54. break;
  55. }
  56. for (int i=1; i<=n; i++) cout<<a[i].rank<<" ";
  57. cout<<endl;
  58. for (int i=1; i<=n; i++)
  59. if(a[i].x==a[i-1].x && i!=j)
  60. {
  61. swap(a[i],a[i-1]);
  62. break;
  63. }
  64. for (int i=1; i<=n; i++) cout<<a[i].rank<<" ";
  65. cout<<endl;
  66. }
  67. return 0;
  68. }

ProblemG:MUH and House of Cards

题意:用n张牌问按照题目要求能摆几层。

题解:每层的牌数为3t+2,先对x=n%3,当x=1时,最少有两个2,即最少有两层,当x=2时,最少有一层,x=3时最少有两层,刚好是x=3-x,现在假设有k层,最少为(3*0+2)+(3*1+2)+(3*2+2)+.......+(3*(k-1)+2<=n,然后再对层数加3,直到不满足上面的条件。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. long long n,ans,sum,t;
  8. int main()
  9. {
  10. cin>>n;
  11. if (n%3==0)
  12. {
  13. t=3;
  14. n-=6;
  15. }
  16. else
  17. if (n%3==1)
  18. {
  19. t=2;
  20. n-=4;
  21. }
  22. else
  23. {
  24. t=1;
  25. n-=2;
  26. }
  27. while(n>=0)
  28. {
  29. sum=(t-1)*t/2;
  30. if (n/3>=sum) ans++;
  31. else break;
  32. n-=6;
  33. t+=3;
  34. }
  35. cout<<ans<<endl;
  36. return 0;
  37. }

ProblemH:

ProblemI:

题意:两个人去工作,希望在同一个房间并同时被叫到,问有几个房间满足。

题解:定义两个变量,分别为当前房间的人数和房间的总容纳量, 相减就是可以容纳的,大于等于二就计数一次。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. int n,a,b,ans;
  8. int main()
  9. {
  10. cin>>n;
  11. for (int i=1; i<=n; i++)
  12. {
  13. cin>>a>>b;
  14. if (abs(a-b)>=2) ans++;
  15. }
  16. cout<<ans<<endl;
  17. return 0;
  18. }

ProblemJ:Fedor and New Game

题意:给定n,m,k,n种士兵,m个部队,兵种不同数量小于等于k的为友军。然后给出m+1行,前m行表示需要判定的部队,第m+1行Fedor的部队。

题解:直接取亦或,然后判断1的个数是否小于等于k。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int a[1005],x,n,m,k,ans,t;
  7. int main()
  8. {
  9. cin>>n>>m>>k;
  10. for (int i=1; i<=m; i++) cin>>a[i];
  11. cin>>x;
  12. for (int i=1; i<=m; i++)
  13. {
  14. t=0;
  15. for (int j=0; j<n; j++)
  16. if (((1<<j)&a[i])!=((1<<j)&x)) t++;
  17. if (t<=k) ans++;
  18. }
  19. cout<<ans<<endl;
  20. return 0;
  21. }

ProblemK:

题意:给定一个长度为n的序列,从序列中选出k个不重叠且连续的m个数,要求和最大。

题解:dp[i][j]表示到第i个位置选了j个子序列。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. long long n,m,k,ans,t,a[10005],sum[10005],dp[5005][5005];
  8. int main ()
  9. {
  10. cin>>n>>m>>k;
  11. for (long long i=1; i<=n; i++)
  12. {
  13. cin>>a[i];
  14. sum[i]=sum[i-1]+a[i];
  15. }
  16. for (long long i=m; i<=n; i++)
  17. {
  18. t=sum[i]-sum[i-m];
  19. for (long long j=1; j<=k; j++)
  20. dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+t);
  21. ans=max(ans,dp[i][k]);
  22. }
  23. cout<<ans<<endl;
  24. return 0;
  25. }

ProblemL:

ProblemM:Cheap Travel

题意:坐n次地铁,m张票卖b元,单张a元,问最小花费。

题解:直接做吧。。。。。。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int n,m,a,b,sum,tmp,t;
  8. int main()
  9. {
  10. cin>>n>>m>>a>>b;
  11. if(m*a<b) tmp=m*a;
  12. else tmp=b;
  13. sum=sum+(n/m)*tmp;
  14. t=n%m;
  15. if (t>0)
  16. {
  17. if((t*a)<b) sum=sum+t*a;
  18. else sum=sum+b;
  19. }
  20. cout<<sum<<endl;
  21. return 0;
  22. }

ProblemN:Wonder Room

题意:给定n,a,b,要求找到ai,bi,(ai≥a, bi≥b)并且ai∗bi≥6∗n,并且ai∗bi要尽量小。

题解:枚举ai,根据6n算出需要的bi。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. long long n,a,b,ans,a1,b1,x,y,a2,b2;
  8. bool bo;
  9. int main ()
  10. {
  11. bo=false;
  12. cin>>n>>a>>b;
  13. n*=6;
  14. a2=a;
  15. b2=b;
  16. ans=0x3f3f3f3f3f3f3f3f;
  17. if (a2>b2)
  18. {
  19. swap(a2,b2);
  20. bo=true;
  21. }
  22. for (long long i=1; i<=n; i++)
  23. {
  24. x=i;
  25. y=(n-1)/i+1;
  26. if (x>y) break;
  27. x=max(x,a2);
  28. y=max(y,b2);
  29. if (x*y<ans)
  30. {
  31. ans=x*y;
  32. a1=x;
  33. b1=y;
  34. }
  35. }
  36. if (bo) swap(a1,b1);
  37. cout<<ans<<endl;
  38. cout<<a1<<" "<<b1<<endl;
  39. return 0;
  40. }

ProblemO:Number of Ways

题意:给你一串数让你分成平均三分,问共有多少种分法。

题解:若平分分成若干种情况,应当整体考虑,对sum/3进行分析。它是区分3段的标准。所以当部分和tmp==sum/3,部分统计+1。当tmp==sum*2/3,则全部统计ans+=部分统计。

参考代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. long long a,t,sum,b[500005],ans,n;
  7. int main()
  8. {
  9. cin>>n;
  10. for (int i=1; i<=n; i++)
  11. {
  12. cin>>a;
  13. sum+=a;
  14. b[i]=sum;
  15. }
  16. for (int i=1; i<=n; i++)
  17. {
  18. if (i>1 && i<n && b[i]*3==b[n]*2)
  19. ans+=t;
  20. if (b[i]*3==b[n])
  21. t++;
  22. }
  23. cout<<ans<<endl;
  24. }

ProblemP:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注