首页 > 其他分享 >济南 Day 7 综合(一)

济南 Day 7 综合(一)

时间:2023-07-30 21:13:20浏览次数:53  
标签:pre 字符 int 样例 long 单词 Day 综合 济南

Solution

T1 制作徽章

原题链接

4106: 制作徽章

简要思路

按照题目模拟即可,注意一定要认真对比样例,一定要认真对比样例,一定要认真对比样例!!!(警钟撅烂)

完整代码

#include<bits/stdc++.h>
using namespace std;

signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=6*n+3;i++){
		if(i==1||i==6*n+3){
			for(int j=1;j<=10*n+3;j++)
				cout<<'#';
			cout<<endl;
		}
		else if(i-1<=n){
			for(int j=1;j<=10*n+3;j++){
				if(j==1||j==10*n+3)cout<<'#';
				else cout<<'.';
			}
			cout<<endl;
		}
		else if(i<=6*n+3-n-1){
			if(i!=1+n+4*n+1){
				for(int k=1;k<=10*n+3;k++){
					if(k==1||k==10*n+3||k==2+2*n)cout<<'#';
					else cout<<'.';
				}
			}
			else{
				for(int j=1;j<=10*n+3;j++){
					if(j!=1&&j!=10*n+3&&(j<=2*n+1||j>10*n+3-1-2*n))cout<<'.';
					else cout<<'#';
				}
			}
			cout<<endl;
		}
		else if(i>=6*n+3-n-1){
			for(int j=1;j<=10*n+3;j++){
				if(j==1||j==10*n+3)cout<<'#';
				else cout<<'.';
			}
			cout<<endl;
		}
	}
	return 0;
}

T2 买苹果

原题链接

4107: 买苹果

简要思路

  1. 首先枚举得到实际需要买多少个苹果,记为 \(m\)。
  2. 然后我们将 \(c3\) 对 \(3 × c1\) 取最小值,将 \(c5\) 对 \(5 × c1\) 取最小值,以防止出现捆绑购买比单买更贵的情况。
  3. 最后枚举买了多少组五个一组的,剩下的苹果尽量买三个一组的,再剩下的只能单买。

完整代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,c1,c3,c5;

signed main(){
	cin>>n>>c1>>c3>>c5;
	int m=0;
	while(m+m/5*2+(m%5)/3<n){//枚举需要的苹果的数量
		m++;
	}
	
	c3=min(c3,c1*3);
	c5=min(c5,c1*5);//取 min
	
	int ans=m*c1;
	for(int i=0;i<=m;i++){//枚举买了几个 5 个一组的
		int surplus=max(m-5*i,1ll*0);//surplus 代表当前除去 5 个一组选的苹果数后所剩余的苹果的数量
		ans=min(ans,i*c5+surplus/3*c3+min(surplus%3*c1,c3));//更新所花钱数,维护 ans,使其最小
	}
	cout<<ans<<endl;
	return 0;
}

优化

  • 优化一
    利用二分答案或直接计算的方法来求 \(m\) 的值。

  • 优化二
    求出买 \(15\) 个苹果的最优价格,将 \(m\) 个苹果中超出 \(30\) 部分都 \(15\) 个一组购买,直到 \(m \leq 30\)。

T3 写文章

原题链接

4108: 写文章

简要思路

  • 暴力
    暴力将文章展开,查询时直接得到那个位置的字符即可。
    注意字符串从 0 开始,从 0 开始,从 0 开始!!!(警钟撅烂)

  • 优化正解

  1. 可以不把文章展开,每次询问时在文章中遍历,找到查询的位置对应的位置,如果是字符则直接输出,是单词则再算出查询位置对应该单词的哪个字符即可。
  2. 针对 \(T=0\) 的情况,文章仅由单词组成。设文章中第 \(i\) 个单词的编号为 \(a_i\)。我们求出 \(length(s_{a_i})\) 的前缀和数组 \(p_i\),即为文章中第 \(i\) 个单词的最后一个字符的位置。询问时,我们可以在 \(p\) 数组上二分得到查询位置对应的单词,然后算出对应哪个字符即可。
  3. 将非单词的字符也传化理解为一个长度为 \(1\) 的单词,然后结合 \(1\),\(2\) 中优化,就可以得出时间复杂度为 \(O(q log(C + T))\) 的正解

完整代码

  • 暴力
#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,q;
string s[100005];
int lens[100005];
char a[50000006];
int len;

signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		lens[i]=s[i].length();
	}

	char cc=getchar();
	while(1){
		char c=getchar();
		if(c=='\n')break;
		if(c=='['){
			int x;
			cin>>x;
			for(int i=0;i<lens[x];i++)
				a[++len]=s[x][i];
		}
		else if(c==']')continue;
		else a[++len]=c;
	}
	while(q--){
		int x;
		cin>>x;
		if(x>len)cout<<'!';
		else cout<<a[x];
	}
	return 0;
}
  • 正解
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;

int n,q;
string s[MAXN];//常用单词
string t;//文章
int cnt;//现在有 cnt 个单词(把字符看成单词)
int id[MAXN];//第 i 个单词对应的编号
long long pre[MAXN];//前缀和,pre[i] 代表第 i 个单词的最后一个字符在整个字符串中的位置

signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=1;i<=26;i++)s[n+i]='a'+i-1;//把 a~z 的每个字符都转化为单词,加到 s 数组的后面
	
	cin>>t;
	int len=t.size();//在外面计算好,防止 TLE
	int now=0;//用来计算中括号内的数字
	
	for(int i=0;i<len;i++){
		if('a'<=t[i]&&t[i]<='z')//字符
			id[++cnt]=t[i]-'a'+1+n;//转化
		
		else {
			if(t[i]=='[')
				now=0;//清零
			else if(t[i]==']')
				id[++cnt]=now;//记录下来编号
			else now=now*10+t[i]-'0';//维护 now 的值
		}
	}
	
	for(int i=1;i<=cnt;i++)//计算每个单词的前缀和
		pre[i]=pre[i-1]+s[id[i]].size();
	
	string ans;//答案字符串
	for(int i=1;i<=q;i++){
		long long x;
		cin>>x;
		int p=lower_bound(pre+1,pre+cnt+1,x)-pre;//寻找第一个大于等于的单词
		if(p>cnt)ans+='!';//不合法
		else ans+=s[id[p]][x-pre[p-1]-1];//答案加上
	}
	cout<<ans<<endl;
	return 0;
}

T4 电车

原题链接

4109: 电车

简要思路

  • 暴力
    Floyd 或 BFS。

  • 正解
    不会/kel

完整代码

咕咕。

今日习题

这里

今日总结

  1. 模拟题一定要将自己的输出和题目给的样例输出仔细比较对比。

  2. 从小样例入手,一点一点思考,直至正解。

  3. 学会上厕所(大雾

标签:pre,字符,int,样例,long,单词,Day,综合,济南
From: https://www.cnblogs.com/CheZiHe929/p/17592040.html

相关文章

  • Day7
    Day6暴力赛T1倒序考虑若在复制位置的前面,则此次无效在里面,则相应地变换在后面,则减去复制的长度#include<bits/stdc++.h>#definelllonglong#defineullunsignedlonglong#definegtgetcharusingnamespacestd;inlinellread(){ llx=0,f=1;charch=gt(); wh......
  • 暑期竞赛培训 Day 11—— < 树状数组 >
    本文大部分内容来自教练的博客[https://www.cnblogs.com/hbhszxyb/]。树状数组一、适用范围:树状数组是一个查询和修改复杂度都为log(n)的数据结构,常常用于查询任意区间的所有元素之和。与前缀和的区别是支持动态修改,log(n)的时间进行修改,log(n)查询。支持如下操作:[1]单......
  • 集训Day 7
            比赛开始看了看T1veryGood有思路,直接用手动全排列A掉(虽然卡了5min左右但get100pt),转过来看T2用暴力模拟A掉(get100pt),接着看T3虽然第一眼因为最大值最小看成了二分,但很快否决了,这指定是一道多源最短路,但是当时脑子亿抽写了一个适用于单源最短路的......
  • 7.30 day7字符串
    60+10+100+0=170连续2天没写出来简单题了,不过我的字符串是真的弱,趁着这次复习一下T1倒序考虑即可T2之前模拟赛里有,但是只记得做过不记得做法了定义一个字符串的本质是\(A_x=x-pre(A_x)\)\(pre(x)\)指上一次出现\(x\)的位置,如果是第一个字符则是0两个字符串相等的条件是本......
  • Java之Stream流综合案例
    Java之Stream流综合案例需求:某个公司的开发部门,分为开发一部和二部,现在需要进行年中数据结算。分析:员工信息至少包含了(名称、性别、工资、奖金、处罚记录)开发一部有4个员工,开发二部有5个员工。分别筛选出2个部门的最高工资的员工信息,封装成优秀员工对象。分别统......
  • Day09_列表类型
    1.list()类型转换用法和作用: 2.列表操作:正向取值、反向去之、可取也可以改、索引不存在则报错: 3.列表操作:列表追加值: 4.列表操作:列表插入值: 5.列表操作:extend用法两个列表元素合并、字符串合并到列表中: 6.列表操作:列表删除方式一del: 7.列表操作:列表删除方......
  • DAY8
    函数指针使用案例(回调函数)代码:#include<stdio.h>voidA(){printf("Hello");}voidB(void(*ptr)())//B函数有一个函数指针作为它的参数{//ptr指向一个函数,这个函数应该是不带参数的而且返回void,就像A那样ptr();//使用函数指针ptr调用......
  • Day6: Shell函数和参数传递
    学习目标学习内容1.函数的定义和调用2.参数传递3.返回值4.练习任务大树哥个人信息学习目标学习Shell中函数的概念和用法。理解如何在函数中定义和调用命令序列。掌握如何传递参数给函数并获取返回值。练习编写脚本,使用函数进行模块化编程。学习内容今天我们将学习如......
  • [代码随想录]Day04-链表part02
    题目:24.两两交换链表中的节点思路:首先给他加一个虚拟头结点,然后思考反转的逻辑,这是每两个为一组,比如1,2是一组、3,4是一组,如果说1,2一组2,3一组就变成了链表的逆转了。那么指针的逻辑是:两个指针一个r指向要交换的二元组的第一个节点一个l指向前一个节点二元组的第二个节......
  • Day6
    Day6T1没啥玩意好说的,就是别忘删freopen#include<bits/stdc++.h>#definelllonglong#defineullunsignedlonglong#definegtgetcharusingnamespacestd;inlinellread(){llx=0,f=1;charch=gt();while(!isdigit(ch)){if(ch=='-')f=-1;ch=gt()......