A题
思路:取出最小值,所有数加到最小值的最大倍数使得不超过k 记录次数即可
#include <bits/stdc++.h> using namespace std; int main () { int T; cin >> T; while(T--) { int n, k; cin >> n >> k; vector<int> a(n); int minn = 0x3f3f3f3f; int sum = 0; for(int i = 0; i < n; ++i) { cin >> a[i]; sum += a[i]; minn = min(minn, a[i]); } int ans = 0; for(int i = 0; i < n; ++i) { ans += (k - a[i]) / minn; } ans -= (k - minn) / minn; cout << ans << endl; } }
B题
思路:分成三种情况。小于最大值的一半,等于最大值的一半,大于最大值的一般。依次标记即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main () { int T; cin >> T; while(T--) { ll n, T; cin >> n >> T; vector<int> a(n); for(int i = 0; i < n; ++i) { cin >> a[i]; } int temp = 1; for(int i = 0; i < n; ++i) { if(a[i] < T / 2 || a[i] == T / 2 && T & 1) { cout << 0 << " "; } else if(!(T & 1) && a[i] == T / 2){ if(temp & 1) { cout << 0 << " "; } else { cout << 1 << " "; } temp++; } else { cout << 1 << " "; } } cout << endl; // int i; // for(i = 0; i < n && a[i] < T / 2; i++) { // cout << 0 << " "; // } // int temp = 1; // for(; i < n && a[i] == T / 2; ++i) { // if(temp & 1) { // cout << 0 << " "; // } // else { // cout << 1 << " "; // } // temp++; // } // for(; i < n; ++i) { // cout << 1 << " "; // } // cout << endl; } }