(CCF CAT 训练二)2023-2024年中国计算机应用技术大赛- 全国算法精英大赛

慈云数据 8个月前 (03-12) 技术支持 116 0

Flower

在这里插入图片描述

反悔贪心,按照时间对花朵进行排序,从0到n-1遍历花朵,如果当前堆中元素小于当前花朵的绽放时间t,直接放入堆中,否则花朵金币数放入堆中并弹出堆中金币数最小值,最后如果堆中元素个数大于k,一直弹出堆中最小金币数直到元素个数等于k

#include 
#include 
#include 
#include 
using NAMEspace std;
const int N=1e5+5;
int t[N], w[N];
int main()
{
  int n, k;
  cin>;>n>>k;
  for(int i=0;i
    cin>t[i];
  }
  for(int i=0;i
    cin>w[i];
  }
  vector v;
  for(int i=0;i
      v.push_back({t[i], w[i]});
  }
  priority_queue
      return p1.first l:tmp->r;
        }
        tmp = new node(i);
        if(pre->v > i){
            pre->l = tmp;
        }else{
            pre->r = tmp;
        }
    }
}
int find(int i){
    node* tmp = root;
    int deep = 1;
    while(tmp!=nullptr){
        tmp = tmp->v>i? tmp->l:tmp->r;
        deep++;
    }
    return deep;
}
int main()
{
  int n;
  cin>>n;
  for(int i=0;i
      int a;
      cin>a;
      iNSErt(a);
  }
  for(int i=0;i
      int a;
      cin>a;
      cout
  int n, m;
  cinnm;
  for(int i=2;i
      cin>t[i];
  }
  for(int i=1;i
      cin>e[i];
  }
  for(int i=1;i 
      cin>d[i];
  }
  memset(dp, -1, sizeof dp);
  dp[1][0]  = 0;
  for(int i=1;i
      if(e[1] - d[1]*(i-1) =0 )
        dp[1][i] = dp[1][i-1] + e[1] - d[1]*(i-1);
      else{
          dp[1][i] = dp[1][i-1];
      }
    //   cout
    //   dp[i]
      for(int j=0; j
        //   dp[i][j] = dp[i-1][j];
          for(int k=0;k
              if(dp[i-1][k]!=-1)
              dp[i][j] = max(dp[i][j], dp[i-1][k] + (long long)e[i]*(j-k-t[i]) - (long long)(j-k-t[i])*(j-k-t[i] -1)*d[i]/ 2);
            //   cout
	// ios_base::sync_with_stdio(false);
	// cin.tie(NULL);
	int n, m;
	// 	cinnm;
	scanf("%d%d", &n, &m);
	t[1] = 0;
	for (int i = 2; i 
		// cint[i];
		scanf("%d", &t[i]);
	}
	for (int i = 1; i 
		// cine[i];
		scanf("%d", &e[i]);
	}
	for (int i = 1; i 
		// cind[i];
		scanf("%d", &d[i]);
	}
	std::vector
		for (int j = 0; e[i] - j * d[i]  0 && j 
			p[i].emplace_back(e[i] - j * d[i]);
		}
	}
	int ans = 0;
	int travel = 0;
	for (int i = 1; i 
		travel += t[i];
		memset(pos, 0, sizeof pos);
		int remain = m - travel;
    	if(remain  //否则remain为负数会进入循环,一直没找到这个错误
			int id = -1, mx = 0;
			for (int j = 1; j 
				if(pos[j] == p[j].size())continue;
				if (p[j][pos[j]]  mx) {
					id = j;
					mx = p[j][pos[j]];
				}
			}
			if (id != -1) {
				tmp_ans += p[id][pos[id]];
				pos[id] ++;
				remain--;
			}
			else {
				break;
			}
		}
		ans = max(ans, tmp_ans);
	}
	printf("%d", ans);
}

  int n;
  cinn;
  for(int i=1;i
      cinarr[i][1]  arr[i][2] arr[i][3];
  }
  memset(dp, -1, sizeof dp);
//   dp[2][1][2] = arr[2][1] + arr[1][2];
//   dp[2][1][3] = arr[2][1] + arr[1][3];
  dp[2][2][1] = arr[2][2] + arr[1][1];
//   dp[2][2][3] = arr[2][2] + arr[1][3];
  dp[2][3][1] = arr[2][3] + arr[1][1];
//   cout
      dp[i][1][2] = dp[i-1][2][1] + arr[i][1];
      dp[i][1][3] = max(dp[i-1][3][1], dp[i-1][3][2]) + arr[i][1];
      dp[i][2][1] = max(dp[i-1][1][2], dp[i-1][1][3]) + arr[i][2];
      dp[i][2][3] = max(dp[i-1][3][1], dp[i-1][3][2]) + arr[i][2];
    //   cout
      dp[i][1][2] = dp[i-1][2][1] + arr[i][1];
      dp[i][1][3] = max(dp[i-1][3][1], dp[i-1][3][2]) + arr[i][1];
      dp[i][2][1] = max(dp[i-1][1][2], dp[i-1][1][3]) + arr[i][2];
      dp[i][2][3] = max(dp[i-1][3][1], dp[i-1][3][2]) + arr[i][2];
      dp[i][3][1] = max(dp[i-1][1][3], dp[i-1][1][2]) + arr[i][3];
      dp[i][3][2] = dp[i-1][2][3] + arr[i][3];
  } 
  ans = max(ans, max(max(max(dp[n][3][1], dp[n][3][2]), dp[n][1][2]), dp[n][1][3]));
//   cout
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon