• 2022“杭电杯”中国大学生算法设计超级联赛(4)D、F、G、K


    Link with Equilateral Triangle

    d

    AC代码:

    d

    BIT Subway

    阅读理解题,注意有可能从小于100直接过渡到200+,这个题答案验证是字符串类型,注意只能保留三位小数

    AC代码:

    1. #include
    2. #define rep(i,a,n) for(int i=a;i
    3. using namespace std;
    4. using LL = long long;
    5. void Solve() {
    6. int n;
    7. cin >> n;
    8. vector<double> a(n);
    9. for (int i = 0; i < n; i++) {
    10. scanf("%lf", &a[i]);
    11. }
    12. double ans = 0.0;
    13. double sum = 0.0;
    14. bool ok = false;
    15. bool ok1 = false;
    16. for (int i = 0; i < n; i++) {
    17. if (sum >= 100 && sum < 200) {
    18. sum += a[i] * 0.8;
    19. }
    20. else if (sum >= 200) {
    21. sum += a[i] * 0.5;
    22. }
    23. else {
    24. sum += a[i];
    25. }
    26. if (!ok) {
    27. if (ans + a[i] >= 100 && (a[i] - (100 - ans)) * 0.8 + 100.0 >= 200) {
    28. double c = 100 - ans;
    29. ans = 100.0;
    30. a[i] = 1.0 * a[i] - c;
    31. double d = (200.0 - ans);
    32. double l = 0.0, r = a[i];
    33. for (int i = 0; i < 50; i++) {
    34. double mid = (l + r) / 2;
    35. if (mid * 0.8 > d) {
    36. r = mid;
    37. }
    38. else {
    39. l = mid;
    40. }
    41. }
    42. ans = 200.0;
    43. ans += 1.0 * (a[i] * 1.0 - l) * 0.5;
    44. ok = true;
    45. ok1 = true;
    46. continue;
    47. }
    48. if (ans + a[i] >= 100) {
    49. double c = ans + a[i] - 100;
    50. ans = 100.0;
    51. ans += 1.0 * c * 0.8;
    52. ok = true;
    53. }
    54. else {
    55. ans += a[i];
    56. }
    57. }
    58. else {
    59. if (ans + 1.0 * a[i] * 0.8 >= 200.0 && !ok1) {
    60. double d = (200.0 - ans);
    61. double l = 0.0, r = 1.0 * a[i];
    62. for (int i = 0; i < 50; i++) {
    63. double mid = (l + r) / 2;
    64. if (mid * 0.8 > d) {
    65. r = mid;
    66. }
    67. else {
    68. l = mid;
    69. }
    70. }
    71. ans = 200.0;
    72. ans += 1.0 * (a[i] * 1.0 - l) * 0.5;
    73. ok1 = true;
    74. }
    75. else if (ok1 && ans >= 200) {
    76. ans += 0.5 * a[i];
    77. }
    78. else {
    79. ans += 0.8 * a[i];
    80. }
    81. }
    82. }
    83. printf("%.3lf %.3lf\n", ans, sum);
    84. }
    85. int main() {
    86. int T;
    87. scanf("%d", &T);
    88. rep (i, 0, T) {
    89. Solve();
    90. }
    91. return 0;
    92. }

    Climb Stairs

    因为只能向上跳k步向下跳1步,走过的楼层不能再走,而且要杀死所有怪兽,只能一段一段考虑,否则下面一定有漏掉的怪兽没有打,所以每次攻击力不够了,我们应从能跳到的最远处(或最后一个怪兽的位置,否则RE)且能够打死的怪兽往后枚举,这样保证都能杀死的同时还可以增加攻击力,如果又遇上打不过的,就将攻击力初始化再重复上述操作,直到遇上最开始打不过的怪兽,如果还打不过,那就真打不过了,否则跳到开始增加攻击力的楼层的下一个位置,这个位置要么是跳不到的最近的地方,要么是最初攻击力打不过的地方

    这样的暴力竟然比他的标程线段树还快,时间复杂度确实没什么问题

     

    AC代码:

    1. #include
    2. #define rep(i,a,n) for(int i=a;i
    3. using namespace std;
    4. using LL = long long;
    5. const int mod = 1e9 + 7;
    6. void Solve() {
    7. LL n, fi, k;
    8. cin >> n >> fi >> k;
    9. vector a(n + 1);
    10. for (int i = 1; i <= n; i++) {
    11. cin >> a[i];
    12. }
    13. for (int i = 1; i <= n; i++) {
    14. if (a[i] > fi) {
    15. int j = i + k - 1;
    16. if (i + k - 1 > n) {
    17. j = n;
    18. }
    19. int l = j;
    20. LL start = fi;
    21. bool ok = false;
    22. for (int z = j; z >= i; z--) {
    23. if (fi >= a[z]) {
    24. fi += a[z];
    25. if (z == i) {
    26. ok = true;
    27. break;
    28. }
    29. }
    30. else {
    31. fi = start;
    32. l = z - 1;
    33. }
    34. }
    35. if (ok) {
    36. i = l + 1;
    37. }
    38. else {
    39. cout << "NO\n";
    40. return;
    41. }
    42. }
    43. else {
    44. fi += a[i];
    45. }
    46. }
    47. cout << "YES\n";
    48. }
    49. int main() {
    50. ios::sync_with_stdio(false);
    51. cin.tie(nullptr);
    52. int T;
    53. cin >> T;
    54. rep (i, 0, T) {
    55. Solve();
    56. }
    57. return 0;
    58. }

    标程:

    1. #include
    2. #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    3. #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    4. #define ren for(int i=fst[x];i;i=nxt[i])
    5. #define Fill(a,x) memset(a,x,sizeof(a))
    6. using namespace std;
    7. typedef long long ll;
    8. typedef double db;
    9. typedef long double ld;
    10. typedef unsigned long long ull;
    11. typedef vector<int> vi;
    12. typedef pair<int,int> pii;
    13. const int inf=2139062143;
    14. const int MOD=998244353;
    15. const int MAXN=200100;
    16. inline int read()
    17. {
    18. int x=0,f=1;char ch=getchar();
    19. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    20. while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    21. return x*f;
    22. }
    23. inline ll readll()
    24. {
    25. ll x=0,f=1;char ch=getchar();
    26. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    27. while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    28. return x*f;
    29. }
    30. namespace CALC
    31. {
    32. inline int pls(int a,int b){return a+b>=MOD?a+b-MOD:a+b;}
    33. inline int mns(int a,int b){return a-b<0?a-b+MOD:a-b;}
    34. inline int mul(int a,int b){return (1LL*a*b)%MOD;}
    35. inline void inc(int &a,int b){a=pls(a,b);}
    36. inline void dec(int &a,int b){a=mns(a,b);}
    37. inline void tms(int &a,int b){a=mul(a,b);}
    38. inline int qp(int x,int t,int res=1)
    39. {for(;t;t>>=1,x=mul(x,x)) if(t&1) res=mul(res,x);return res;}
    40. inline int Inv(int x){return qp(x,MOD-2);}
    41. }
    42. using namespace CALC;
    43. int n,a[MAXN],k,las,cur,l,r;
    44. pairint> q[MAXN];
    45. ll sum[MAXN],f[MAXN],mxf[MAXN];
    46. ll mn[MAXN<<2];
    47. void build(int k,int l,int r)
    48. {
    49. if(l==r) {mn[k]=f[l];return ;}int mid=l+r>>1;
    50. build(k<<1,l,mid);build(k<<1|1,mid+1,r);
    51. mn[k]=min(mn[k<<1],mn[k<<1|1]);
    52. }
    53. int res=inf;
    54. void query(int k,int l,int r,int a,int b,int w)
    55. {
    56. if(a<=l&&r<=b)
    57. {
    58. if(mn[k]>w||res!=inf) return ;
    59. if(l==r) {res=l;return ;}int mid=l+r>>1;
    60. if(mn[k<<1]<=w) query(k<<1,l,mid,a,b,w);
    61. else if(mn[k<<1|1]<=w) query(k<<1|1,mid+1,r,a,b,w);
    62. return ;
    63. }
    64. int mid=l+r>>1;
    65. if(a<=mid) query(k<<1,l,mid,a,b,w);
    66. if(b>mid) query(k<<1|1,mid+1,r,a,b,w);
    67. }
    68. int solve()
    69. {
    70. n=read(),a[0]=sum[0]=read(),k=min(read(),n);
    71. rep(i,1,n) a[i]=read(),sum[i]=sum[i-1]+a[i];
    72. f[0]=sum[0]<<1;rep(i,1,n) f[i]=max(sum[i]+a[i],f[i-1]);
    73. rep(i,0,n) f[i]=f[i]-sum[i];
    74. //rep(i,0,n) cout<
    75. build(1,1,n);
    76. las=-1,cur=0;
    77. while(cur!=n)
    78. {
    79. res=inf;
    80. query(1,1,n,cur+1,min(las+k+1,n),sum[cur]);
    81. //cout<
    82. if(res==inf) return 0;
    83. las=cur,cur=res;
    84. }
    85. return 1;
    86. }
    87. int main()
    88. {
    89. rep(T,1,read()) puts(solve()?"YES":"NO");
    90. }

    Link is as bear

    线性基板板题,从这 个数里任取一些数异或起来的方案,都是可以构造出对应的操作来 做到的,问题完全等价于给n个数,从中选一些数,使得这些数的异或和最大。

    AC代码:

    1. #include
    2. #define rep(i,a,n) for(int i=a;i
    3. using namespace std;
    4. using LL = long long;
    5. const int mod = 1e9 + 7;
    6. void Solve() {
    7. int n;
    8. cin >> n;
    9. vector a(n);
    10. for (int i = 0; i < n; i++) {
    11. cin >> a[i];
    12. }
    13. int k = 0;
    14. for (int i = 62; i >= 0; i--) {
    15. for (int j = k; j < n; j++) {
    16. if (a[j] >> i & 1) {
    17. swap(a[j], a[k]);
    18. break;
    19. }
    20. }
    21. if (!(a[k] >> i & 1)) {
    22. continue;
    23. }
    24. for (int j = 0; j < n; j++) {
    25. if (j != k && (a[j] >> i & 1)) {
    26. a[j] ^= a[k];
    27. }
    28. }
    29. k++;
    30. if (k == n) {
    31. break;
    32. }
    33. }
    34. LL ans = 0;
    35. for (int i = 0; i < k; i++) {
    36. ans ^= a[i];
    37. }
    38. cout << ans << '\n';
    39. }
    40. int main() {
    41. ios::sync_with_stdio(false);
    42. cin.tie(nullptr);
    43. int T;
    44. cin >> T;
    45. rep (i, 0, T) {
    46. Solve();
    47. }
    48. return 0;
    49. }

  • 相关阅读:
    Java面试(JVM篇)——JVM 面试题合集 & 深入理解JVM虚拟机
    uniapp如何在页面中只展示一条随机数据
    Playwright+Python+Pytest:基础方法二次封装简化及链式调用
    Hadoop--03---HDFS_01----概述
    网上期货开户高效方便简单
    基于JavaWeb的家庭食谱管理系统设计与实现
    C#控件开发错误解决记录
    Jmeter安装(快速入门)
    EN 14384立柱式消防栓—CE认证
    原生Javascript(数组操作方法总结)-更新
  • 原文地址:https://blog.csdn.net/eyuhaobanga/article/details/126117829