https://codeforces.com/contest/1992
B
首先排一次序 可以发现对于最长的可以采取合并 其他的长度拆解成一,将所有1与最长的合并
# include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int n,k;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
sort(a+1,a+k+1);
int sum=0;
for(int i=1;i<k;i++)
{
if(a[i]!=1)
sum+=a[i]-1+a[i];
else sum++;
}
cout<<sum<<endl;
}
return 0;
}
C
要求f[i]-g[i]最大 考虑贡献最大的及f[i]最大 g[i]最小,即满足前缀大于等于k和最大 同理小于m和最小
# include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m,k;
cin>>n>>m>>k;
for(int i=n;i>=min(m+1,k);i--)
cout<<i<<" ";
for(int i=1;i<=m;i++)
cout<<i<<" ";
cout<<endl;
}
return 0;
}
D
考虑贪心的走 每次尽量走木板 没有模板则选择游泳 有鳄鱼则输出NO
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int t;
cin >> t;
while (t--)
{
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n + 1, 0);
string s;
cin >> s;
for (int i = 0; i < m && i < n + 1; i++)
a[i] = 1;
for (int i = 0; i < n; i++)
{
int index = i + 1;
if (s[i] == 'L')
for (int j = 0; j < m && index + j < n + 1; j++)
a[index + j] = 1;
}
int cnt = 0;
bool cor = false;
for (int i = 1; i <= n; i++)
{
char c = s[i - 1];
if (c == 'W' && !a[i])
cnt++;
if (c == 'C' && !a[i])
cor = true;
}
cout << (cnt > k || cor ? "NO\n" : "YES\n");
}
return 0;
}
E
题目数据范围不大 考虑枚举a b满足条件即可 可以发现
n长度*a-b=k位数 要用到to_string stoi()
# include <bits/stdc++.h>
using namespace std;
int n;
int size(int x)
{
int cnt=0;
if(x/10==0)
return 1;
while(x)
{
if(x%10>=0)cnt++;
x/=10;
}
return cnt;
}
int main()
{
int T;
cin>>T;
while(T--)
{
vector<pair<int,int> >ans;
cin>>n;
for(int a=1;a<=10000;a++)
{
int j=size(n),i=size(n*a);
string s=to_string(n);
string ss=s+s+s+s+s+s+s+s+s;
for(int k=1;k<=i;k++)
{
int b=a*j-k;
if(!(b>=1&&b<=min(a*n,10000)))
continue;
string s1=ss.substr(0,a*j-b);
int x=stoi(s1);
if(x==a*n-b&&(b>=1)&&b<=min(a*n,10000))
ans.push_back({a,b});
}
}
cout<<ans.size()<<endl;
for(auto x:ans)
cout<<x.first<<" "<<x.second<<endl;
}
return 0;
}