Codeforces Round #560 (Div. 3) 题解报告

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值