首页 > 其他分享 >「ROIR 2021 Day 1」题解

「ROIR 2021 Day 1」题解

时间:2022-10-04 18:12:15浏览次数:45  
标签:ttx get read 题解 sum len ROIR ch 2021

loj 有原题。别问为什么没 T4,问就是不会,等以后来补。

T1-两台机器

设两台机子分别为 \(a,b\),分 \(4\) 种情况:只用 \(a\),只用 \(b\),先 \(a\) 后 \(b\),先 \(b\) 后 \(a\),判断时间上是否满足,取最大值。

int main()
{
	ll k,a,b,c,d;
	read(k);read(a);read(b);read(c);read(d);
	// if(a>c)swap(a,c),swap(b,d);
	ll ans=0;
	if(k-a-c>=0)cout<<max((k-a)*b+(k-a-c)*d,(k-c)*d+(k-a-c)*b);
	else{
		if(k>=a)ans=(k-a)*b;
		if(k>=c)ans=max(ans,(k-c)*d);
		cout<<ans;
	}
	return 0;
}

T2-分割数表

观察 \(a_{i,j}\),其实就是123456...一直往下排。
直接来推柿子:对于总和:\(sum=mn(mn+1)/2\),很明显是吧。
然后题目要求我们切一刀分成和不同的两块。
对于竖着切,设切了 \(k\) 列,左边那块的和为:

\[\sum_{i=1}^n\sum_{j=1}^k(i-1)\times m+j\\ =\sum_{i=1}^nkm(i-1)+k(k+1)/2\\ =kmn(n-1)/2+nk(k+1)/2\\ =\frac {nk(mn-m+k+1)} 2 \]

对于横着切,一样的,设切了 \(k\) 行,上面的那块和是等差数列,末项为 \(mk\),那么和为:

\[\frac {mk(mk+1)}2 \]

然后我们可以 \(O(1)\) 求和,那么枚举行列就可以得出 \(O(n+m)\) 的算法。

考虑优化,希望最小化 \(\max(\sum x,\sum y)\),那肯定越接近 \(sum/2\) 越好,这个时候有两个办法:

  1. 二分,枚举行列显然有单调性,二分到 \(sum/2\),注意 \(\pm1\) 的误差,都要算一遍。
  2. 直接解方程解出 \(k\),也要注意 \(\pm1\) 的误差。

代码写成屎山了,细节有亿点点多,上 loj 贺代码。

T3 基因突变

队测的时候摆烂了暴力都没打。。。基因只因鸡~~~

注意 \(1,3\) 操作,如果一个字符可以换,那它肯定可以删,且删肯定比换更优,所以 \(3\) 操作没卵用。

将所有的相同字母看作一个块,记录这些块方便使用。
首先考虑最小化,显然只能用操作 \(2\),如果在长度大于二的块内删,那对答案贡献最多是 \(1\),甚至没有贡献:如 3AC4A2AC4A
对于上面的例子,最好方法肯定删 C,贡献也很容易计算。

接下来考虑最大化,最坏办法是插一个字符产生 \(1\) 的贡献,最优的肯定是在大于 \(2\) 的块内添字符,如 6A3AC3A,也就是我们要将前面的数字拆开,使位数最大化,这时很容易产生一个错误:操作的数字越大会使答案更优。但其实不是,举出反例:6A3AC3A,产生 \(3\) 的贡献;11A10ACA5AC6A,产生 \(2\) 的贡献。但 \(3>2\),所以说我们每个数字都要枚举。
接下来要考虑怎么分,手模几组数据可以知道,只会有两种分发,一种折半分,如 \(8,100,1000=500+500\),另一种分成小于它的最大的 \(10\) 的幂,如 \(13,12=10+2\)。所以我们对一个数分成两种情况取最大值。

mdsb分类讨论题,一个小时真的写吐了,感谢 loj 一位老哥的代码:

#include<bits/stdc++.h>
#define fi first
#define se second
#define is(ch) isdigit(ch)
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using ull=unsigned long long;
void read(int &x){
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<1)+(r<<3)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=2e5+7;
char t[N];
int n,cnt;
struct node{
	char c;
	int len;
}a[N];
int get(int x){
	if(x==1)return 0;
	int sum=0;
	while(x){
		sum++;
		x/=10;
	}
	return sum;
}
void getmin(){
	int pos=0,s=0;
	int val=0; 
	for(int i=1;i<=cnt;i++)if(a[i-1].c==a[i+1].c&&a[i].len==1)
	{
		int x=a[i-1].len+a[i+1].len;
		if(get(a[i-1].len)+get(a[i+1].len)-get(x)>=val)
		{
			pos=i;
			val=get(a[i-1].len)+get(a[i+1].len)-get(x);
		}
	}
	if(!pos)
		for(int i=1;i<=cnt;i++)if(a[i].len<=2){pos=i;break;}
	for(int i=1;i<=pos-1;i++)s+=a[i].len;
	printf("2 %d\n",s+1);
}
char cc[]={'A','G','C','T'};
int get2(int x)
{
	int t=1;
	while(t*10<x)t*=10;
	return t;
}
void getmax(){
	int pos;	
	int val=0,tval;
	for(int i=1;i<=cnt;i++){
		int ttt=get2(a[i].len),ttx;
		if(get(ttt)+get(a[i].len-ttt)>get(a[i].len>>1)*2)ttx=ttt;
		else ttx=a[i].len>>1;
		if(get(ttx)+get(a[i].len-ttx)+2-get(a[i].len)>=val&&a[i].len>=4){
			val=get(ttx)+get(a[i].len-ttx)-get(a[i].len)+2;
			pos=i;
			tval=ttx;
		}
		//3A AC2A
		else if(a[i].len==3&&val<2){
			val=2;
			pos=i;
			tval=ttx;
		}
		//2A ACA A AC
		else if(a[i].len<3&&val<1){
			val=1;
			pos=i;
			tval=ttx;
		}
	}
	int s=0;
	char ans;
	for(int i=0;i<=3;i++)if(cc[i]!=a[pos].c&&cc[i]!=a[pos+1].c)ans=cc[i];
	for(int i=1;i<=pos-1;i++)s+=a[i].len;
	printf("1 %d %c\n",s+tval,ans);
}
int main(){
	scanf("%s",t+1);
	n=strlen(t+1);
	int now=0;
	for(int i=1;i<=n;i++){
		if(is(t[i]))now=now*10+t[i]-'0';
		else{
			a[++cnt].c=t[i];
			a[cnt].len=now==0?1:now;
			now=0;
		}
	}
	getmin();
	getmax();
	return 0;
}

标签:ttx,get,read,题解,sum,len,ROIR,ch,2021
From: https://www.cnblogs.com/LAK666/p/16754150.html

相关文章

  • 报告分享|2021中国实体零售数字化专题报告
    全文链接:http://tecdat.cn/?p=28716原文出处:拓端数据部落公众号 作者:MingjiTang统计学中传统的数据类型有截面数据和时间序列数据。这两者都只能在某一纵向或横向上......
  • Windows下CLion中文乱码问题解决
    (目录)原因分析Windows内部采用UTF-16编码,对于中文操作系统使用GBK编码,但是CLion默认文本编码为UTF-8,当编码不一致时,就会造成输出乱码,甚至编译不通过。解决方案当然,对于......
  • 类与对象课件问题解答
    结果:true 结果:false原因:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等。     当“==”施加于引用类型变量时,是比较这两个变量是否引用......
  • Luogu P5089 [eJOI2018] 元素周期表 题解
    (从洛谷博客搬过来的)这道题嘛..主要还是找性质推规律。拿到题,第一眼:噢噢爆搜啊。第二眼:噢噢贪心啊。第三眼:很好贪心假了。然后苦思冥想半个小时去看题解。看到兔队的......
  • CF1427E Xum 题解
    (从洛谷博客搬过来的)学校比赛的时候考了这道题,我当然是一分没得。这是一道好构造题。先不说正解,我看别的题解都没有说怎么拿部分分,但是如果赛时不会正解,那么拿部分分就......
  • Premiere Pro 2021 for Mac(pr 2021 直装版)v15.4.1中文版 mac/win
    PremierePro2021forMac是Adobe公司旗下的一款功能强大的视频编辑软件,具有智能化视频剪辑工具,可以为您提供采集、剪辑、调色、美化音频、字幕添加、输出、DVD刻录的一整......
  • “科林明伦杯”哈尔滨理工大学暑假训练赛 F 题解
    题目内容传送门前置知识组合数乘法逆元Modularint模板题目分析分析输入与题意,本题关键即在推导有多少个不同数组的计算公式。设当前数组最大值为i,则有:\[ans_i......
  • 【补档】CSP2021-J 游记
    (洛谷博客版本)前传:CSP2020-J游记上一次拿了2=,这次争取冲1=!主要时间花在复赛内容上面了,初赛没怎么搞。初赛看到前15题一阵狂喜:这次稳了。单选好像只错了两三题的......
  • 洛谷 P8557 炼金术 题解
    题目大意给定\(n\)种金属,放进\(k\)个熔炉,要求最终每种金属都要能从熔炉里拿出来,求熔炉炼金的方案数对\(998244353\)取模。分析从金属角度考虑。不难发现对于每......
  • 2022-2023-1 20211326《信息安全专业导论》第六周学习总结
    作业信息(1)XOR加密https://www.mosoteach.cn/web/index.php?c=interaction_homework&m=s_write&clazz_course_id=C070E3BB-B075-4571-98F8-B939119D851A&id=D647648F-56AB......