A
求最小操作次数 构造结果数组最大20位
n-y-1位置一定为1
n-x ~n-1 其他位置一定为0
不为ans++
B
now=1 排序后 判断a[i]<=now 满足条件now++ cnt++
输出cnt 最多几天
C 字符串STL
pop_back()弹出奇数个最后1个值
https://codeforces.com/contest/1165/problem/C
如果一个字符串奇数位置与偶数位置不同 且长度为偶数 则为好字符串
给你一个长度为n(可以为奇数)的字符串 最少删除多少个使之变成好字符串
输出删除数 和结果串
添加构造结果串
如果结果串长度为偶数 则不用验证插入字符
长度为奇数 则插入时验证结果串末尾 和插入字符是否==
注意特判aabcde
abcde
好字符串长为偶数
int t,n,a[maxn],b[maxn],x,y;
string s,res;
int main()
{
cin>>n;
cin>>s;
for(int i=0;i<n;i++){
if(res.size()%2==0 || res.back()!=s[i]) //长度已经为偶数 下一个随便放 长度为奇数 对应字符不能相等
res.pb(s[i]);
}
if(res.size()&1)
res.pop_back();
cout<<n-res.size()<<endl<<res<<endl;
return 0;
}
D 因子数论
给你t组样例
每次给你n个数d[i] 都为x的因子(除1和x本身)
猜出最小的x
排序后 假设
x=d1*dn
sqrt(x)复杂度找x因子
压入Vector 2 24 3 16 4 12 6 8 排序后
结果数组与原数组d要完全相同输出x 否则输出-1
1
2
x=2*2=4
分解因子 压入1个2
res数组与原d数组 大小相等 值也相等
注意x=1e12 long long
int t,n,a[maxn],b[maxn],x,y;
string s,res;
int main()
{
cin>>t;
while(t--){
cin>>n;
vector<ll> d(n),res;
rep(i,0,n-1){
cin>>d[i];
}
sort(d.begin(),d.end());
ll x=d[0]*d[n-1]; //1e6*1e6 除1 x
for(int i=2;1ll*i*i<=x;i++){
if(x%i==0){
res.pb(i);
if(i!=x/i)
res.pb(x/i);
}
}
sort(res.begin(),res.end());
if(res==d) //大小相等 值对应相等
cout<<x<<endl;
else
cout<<-1<<endl;
}
return 0;
}
E
求下式最小值 把 a[i] * (i + 1)*(n - i) 可以处理成定值,然后从大到小排序
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=2e5+5; //ni<=1e9 总方案数 最多44722个3连续 估计还达不到
const int INF=0x3f3f3f3f;
const int mod=998244353;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
int t,n,x,y;
string s,res;
int main()
{
#ifdef _DEBUG
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
cin>>n;
vector<int> a(n),b(n);
forn(i,n){
cin>>a[i];
}
forn(i,n){
cin>>b[i];
}
sort(b.begin(),b.end());
vector<pair<ll,int> > v(n); //由于ai*bi出现次数=(i+1)*(n-i)=(2+1)*(5-2)=9次 与位置有关
//2e5*2e5*a[i]=4e10*1e6=4e16
forn(i,n){
v[i].fi=1ll*(i+1)*(n-i)*a[i];
v[i].se=i;
}
sort(v.rbegin(),v.rend());
//相当于 a值从大到小排序 b值从小到大排序
ll ans=0;
forn(i,n){
ans=(ans+(1ll*v[i].fi*b[i])%mod)%mod;
}
cout<<ans<<endl;
return 0;
}