2 条题解

  • 2
    @ 2025-11-8 20:43:33
    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 1e6, mod = 1e9+7, inf = 1e18 + 5;
    
    void solve() {
        int n,m,k;
        cin >> n >> k >> m;
        int s = n / k; // k的倍数的个数
        int les = n - s; // 不是k的倍数的个数
        int ans = 0;
        if(m <= les){ // 若可以改变的个数m <= 非k的倍数的个数
            ans += m; // 将 m 个 非k倍数的数 改为k, 对答案贡献 + m 
            ans += (s + 1) / 2; // 原本是k的倍数的数,相邻两个数对贡献 + 1
            //(s+1) / 2 : (s+1) 
        }
        else{ // 可以改变的个数m > 非k的倍数的个数
            ans += les; // 将非k的倍数的数全变为k,对答案贡献 + les
            m -= les; // 还能改变的个数 m = m - les
            s -= m; // k的倍数的个数有s个,将改变其中的m个变成k
            ans += m; // 贡献 + m
            ans += (s+1)/2; // 相邻两个数对贡献 + 1
        }
        cout << ans << endl;
    }
    signed main() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int T = 1;
        cin >> T;
        while (T--)
            solve();
        return 0;
    }
    
    • 1
      @ 2025-11-14 16:42:24
      #include<stdio.h>
      #define int long long
      signed main() {
      	int t;
      	scanf("%lld", &t);
      	while (t--) {
      		int n, k, m;
      		scanf("%lld%lld%lld", &n, &k, &m);
      		int q;
      		q = n / k;
      		int count = 0;
      		if(m==n){
      			printf("%lld\\n",n);   //特例m==n
      		}
      		else if (m - (n - q) >= 0) {
      			count = n - q;   //非k倍数,全部都要改
      			count += 1;      //把K先算进去
      			m = m - (n - q); //剩余可改数
      			q = q - m - 1;   //把剩下的m全部给q(k的倍数)改,k提前提出来,所以要减去1
      			count = count + m + q / 2;  //剩余几个k的倍数的两两结合
      			printf("%lld\\n", count);
      		}
      		else if (m - (n - q) < 0) {
      			count = m + (q + 1) / 2;
      			printf("%lld\\n", count);
      		}
      	}
      	return 0;
      }
      
      • 1

      你以为ta在拖妥协,其实ta在默默离开

      信息

      ID
      1192
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      119
      已通过
      23
      上传者