ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Atcoder ABC169

2022-08-15 15:04:52  阅读:119  来源: 互联网

标签:std Atcoder int cin 中位数 ABC169 vector dp


A

  直接输出\(a × b\)即可

    int a, b;
    std::cin >> a >> b;
    std::cout << a * b << "\n";

B

  将所有的\(N\)个数乘起来看是不是大于\(10 ^ {18}\),很明显会爆\(long\ long\)而用高精度的话也太麻烦了,所以可以考虑用\(\_\_ int128\_ t\),但也有可能会出现最后一个数是\(0\),前面所有数乘起来大于\(10 ^ {18}\)的情况,所以将所有的数先排序,排完序之后再乘起来.

	int n;
	std::cin >> n;
	std::vector<int64_t> a(n);
	for (int i = 0; i < n; i++ ) 
		std::cin >> a[i];
	std::sort(all(a));
	i128 ANS = 1;
	for (int i = 0; i < n; i++ ) {
		if (ANS * a[i] > INF || ANS * a[i] < 0) return std::cout << "-1\n", 0;
		ANS *= a[i];
	}
	std::cout << ANS << "\n";

C

  看起来是一个可以直接乘起来的题,但是会因为\(double\)丢精度,所以我们要把\(double\)先转化成\(int\)再做乘法.

	i64 a;
	std::string b;
	std::cin >> a >> b;
	int B = 0;
	for (auto c : b) {
		if (c == '.') continue;
		B = B * 10 + (c - '0');
	}
	std::cout << a * B / 100 << "\n";

D

  我们要将\(N\)尽可能多的执行操作,而\(N\ =\ p_1 ^ {k1} * p_2 ^ {k_2} * \dots * p_m ^ {k_m}\),一定是让最小的尽可能的用,所以从\(2\)开始枚举,让\(N\)每次除以它的倍数,这样我们就可以做到\(O\left(\sqrt{N}\right)\)的复杂度

    signed main() {
        std::cin.tie(nullptr) -> sync_with_stdio(false);
  	  i64 N;
  	  std::cin >> N;
  	  i64 ans = 0;
  	  for (int i = 2; i * 1ll * i <= N; i++ ) {
  	  	  for (i64 j = i; N % j == 0; j *= i) ans ++, N /= j;
  		  while(N % i == 0) N /= i;
  	  }
  	  std::cout << ans + (N != 1) << "\n";
        return 0 ^ 0;
    }

E

  结论题,我们可以取得最小中位数和最大中位数之间的所有中位数,都可以被取到.所以,我们按照这个写一个程序,先算出最小取到的中位数和最大取到的中位数,然后用分类讨论,等差数列求项数公式求出即可。(偶数的情况公差是0.5,奇数的情况公差是1)。

    signed main() {
        std::cin.tie(nullptr) -> sync_with_stdio(false);
  	  int N;
  	  std::cin >> N;
  	  std::vector<int> A(N), B(N);
  	  rep(i,0,N) {
  		  std::cin >> A[i] >> B[i];
  	  }
  	  std::sort(all(A));
  	  std::sort(all(B));
  	  std::cout << (N & 1 ? B[N / 2] - A[N / 2] + 1 : B[N / 2] + B[N / 2 - 1] - A[N / 2] - A[N / 2 - 1] + 1) << "\n";
        return 0 ^ 0;
    }

F

  我们要求出在\(2 ^ {N-1}\)个集合中\(A_{k_1} + A_{k_2} + \dots + A_{k_m} =s\)的个数,很容易想到要用\(dp\)来求解,我们设状态\(dp\left[i\right]\left[j\right]\)来表示选到第\(i\)个数的时候和为\(j\)的方案有多少个,就相当于转化成了一个背包问题。

    signed main() {
          std::cin.tie(nullptr) -> sync_with_stdio(false);
    	int N, s;
    	std::cin >> N >> s;
    	std::vector<int> a(N + 1);
    	rep(i,1,N + 1) std::cin >> a[i];
    	
    	std::vector<std::vector<Z>> dp(N + 1, std::vector<Z> (s + 1));
    	dp[0][0] = 1;
    	for (int i = 1; i <= N; i++ ) {
    		for (int j = s; j >= 0; j -- ) {
    			dp[i][j] += dp[i - 1][j] * 2; // 当前这个数加不加进来 两种方案
    			if (j + a[i] <= s) dp[i][j + a[i]] += dp[i - 1][j];
    		}
    	}
    	std::cout << dp[N][s] << "\n";
          return 0 ^ 0;
    }

标签:std,Atcoder,int,cin,中位数,ABC169,vector,dp
来源: https://www.cnblogs.com/Haven-/p/16588273.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有