CCNUACM寒假培训第二周周赛部分题解(ACF)

A题大意:

给出n个数,每次可以选择任意一个数进行加一操作,可执行k次,求最大值可能的最大最小值

考虑最大值最大,即所有操作都对初始n个数中的最大值进行,答案即max(a1,.....,an)+k。

考虑最大值最小,即所有操作先让n个数都变成初始最大值,此时答案为初始最大值。

如果存在多余的操作未彻底使用,则均摊到每一个数上(类似抽屉原理思想),则可得到最大值可能的最小值。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 1e18;
const int logn = 21;
const int N = 1e6 + 10;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a.begin()+1, a.end());
    int num = 0;
    for(int i = 1; i <= n; i++) {
        num += (a[n]-a[i]);
    }
    int maxn = a[n] + k;
    int minn;
    if(num >= k) minn = a[n];
    else minn = (k - num + n - 1) / n + a[n];
    cout << maxn << " " << minn << endl; 
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T--) solve();
    return 0;
}

C题大意

给出一个字符串,第一次出现的字符贡献为2,否则为1,计算贡献

贡献为字符串长度+字符种类数,每个字符贡献至少为1,并且第一次出现的字符贡献再+1,后者即字符种类数。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 1e18;
const int logn = 21;
const int N = 1e6 + 10;

void solve() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    s = " " + s;
    set<char> st;
    for(int i = 1; i <= n; i++) {
        st.insert(s[i]);
    }
    cout << n + st.size() << endl;
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T--) solve();
    return 0;
}

F题大意:

给出一个字符串,删去其中的?

对于每个字符判断是否为?,不是就输出,记得行末回车和字符串初始化

#include<bits/stdc++.h>
using namespace std;
char a[2000000];
int main()
{
	//freopen("a10.in","r",stdin);
	//freopen("a10.out","w",stdout);
 	int t;
 	scanf("%d",&t);
 	while (t--)
 	{
 		scanf("%s",a+1);
 		int n=strlen(a+1);
 		for (int i=1;i<=n;i++) if (a[i]!='?') printf("%c",a[i]);
 		printf("\n");
 	}
 	return 0;
}
posted @ 2023-01-01 15:24  by_wang  阅读(67)  评论(0)    收藏  举报
Live2D