7-1 选举

让我们解决第一个候选人的问题,为了赢得选举,他需要比其他候选人至少多获得1张选票。因此,第一个候选人至少需要获得 m a x ( b , c ) + 1 max(b,c)+1 max(b,c)+1 票。 如果 a a a 已经大于这个值,那么你不需要添加任何投票,否则你需要添加 m a x ( b , c ) + 1 − a max(b,c)+1−a max(b,c)+1a 票。 所以第一个候选的答案是 m a x ( 0 , m a x ( b , c ) + 1 − a ) max(0,max(b,c)+1−a) max(0,max(b,c)+1a)

类似地,第二个候选人的答案是 m a x ( 0 , m a x ( a , c ) + 1 − b ) max(0,max(a,c)+1−b) max(0,max(a,c)+1b),第三个候选人的答案是 m a x ( 0 , m a x ( a , b ) + 1 − c ) max(0,max(a,b)+1−c) max(0,max(a,b)+1c)

#include <bits/stdc++.h>
using namespace std;

int solveSingle(int best, int other1, int other2){
   
	return max(0, max(other1, other2) + 1 - best);
}

int main(){
   
	int t;
	cin >> t;
	while (t--){
   
		int a, b, c;
		cin >> a >> b >> c;
		cout<<solveSingle(a, b, c)<<' '<<solveSingle(b, a, c) <<' '<<solveSingle(c, a, b) << '\n';
	}
	return 0;
}

7-3 Dividing candy

由于侄子清空了他所选择的盒子 i i i,并希望使其他 n − 1 n-1 n1个盒子相等,那么这意味着至少所有数组a的总和应该被 ( n − 1 ) (n-1) (n1)整除,而且其他每个盒子里的块数应该至少是 ⌈ s u m n − 1 ⌉ ⌈\frac{sum}{n-1}⌉ n1sum(上限函数)。

另一方面,由于侄子选择了 i i i,那么他可以选择一个不是最大值的盒子,而且由于他使唯一的盒子 i i i为空,那么其他每个盒子中的最终数量应该至少是最大值。

总的来说,所产生的 n − 1 n-1 n1个其他盒子中的每个块的数量应该至少是 k = m a x ( ⌈ s u m n − 1 ⌉ , m a x ) k=max(⌈\frac{sum}{n-1}⌉,max) k=max(n1sum,max),我们需要在初始数组中添加至少 ( n − 1 ) ⋅ k − s u m (n-1)⋅k-sum (n1)ksum元素。

#include <bits/stdc++.h>
using namespace std;
 
int a[100000+5];
int n;
long long sum, ans;
 
void solve(){
   
    cin>>n;
    for(int i = 0; i < n; i++){
   
        cin>>a[i];
    }
    if(n == 2){
   
    	cout<<"0\n";
    	return;
    }
    int mx = *max_element(a, a + n);
    sum = 0;
    for(int i = 0; i < n; i++){
   
        sum += (mx - a[i]);
    }
    sum -= mx;//本身被分了
    if(sum == 0) ans = 0;		//0
    else if(sum > 0) ans = sum;	//需要补齐的糖果数
    else{
   
        sum = abs(sum);			//可以给其他的n-1堆分配
        sum %= (n - 1);			//取余
        if(sum){
   				//未分配完
        	ans = n - 1 - sum;	//sum余数可以分配,ans为sum分配完剩下的个数
        }
        else{
   
        	ans = 0;
        }
    }
    cout<<ans<<endl;
}
int main(){
   
    int TC;
    cin>>TC;
    while(TC--){
   
        solve();
    }
    return 0;
}

7-9 Strings

在这个问题中,您可以迭代每种类型的操作删除了多少个字符。如果从字符串 s s s中删除了开头的 l l l个字符和结尾的 x x x个字符,则子字符串 s [ l + 1 , n − x ] s[l+1,n−x] s[l+1nx] 保留,其中 n n n是字符串 s s s的长度。

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

void solve() {
   
    string a, b;
    cin >> a >> b;
    int n = a.size(), m = b.size();
    int ans = 0;
    for (int len = 1; len <= min(n, m); len++) {
   
        for (int i = 0; i + len <= n; i++) {
   
            for (int j = 0; j + len <= m; j++) {
   
                if (a.substr(i, len) == b.substr(j, len)) {
   
                    ans = max(ans, len);
                }
            }
        }
    }
    cout << a.size() + b.size() - 2 * ans << "\n";
}

int main() {
   
    int n;
    cin >> n;
    while (n--) {
   
        solve();
    }
    return 0;
}