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;
}
标签:周赛,const,ACF,字符,int,题解,最大值,long,define
From: https://www.cnblogs.com/by-w/p/17018118.html