【第三次训练赛】

Olympiad Date
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main()
{
	ll t;
	ll n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		ll s[n];
		 map<ll,ll> p;
		ll falg=0;
		for(ll i=0;i<n;i++)
		{
			cin>>s[i];
		}
		for(ll i=0;i<n;i++)
		{
			p[s[i]]++;//存储相同的数的数量
			if(p[2]>=2&&p[0]>=3&&p[3]>=1&&p[5]>=1&&p[1]>=1)//当满足这个日期所需要的数字时
			{
				falg=i+1;//寻找第一次满足日期所需要的数字时的下标
				break;
			}
		}
		cout<<falg<<endl;
	}
	return 0;
}

Scale

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main()
{
	ll t;
	cin>>t;
	while(t--)
	{
		ll n,k;
		cin>>n>>k;
		char s[n][n];
		for(ll i=0;i<n;i++)
		for(ll j=0;j<n;j++)
		cin>>s[i][j];
		ll x=0,y=0;
		char s1[n][n];
		for(ll i=k-1;i<n;i+=k)//对其列进行压缩
		{y=0;
			for(ll j=k-1;j<n;j+=k)//对其行进行压缩
			{
				s1[x][y]=s[i][j];
				y++;
			}
			x++;
		}
		for(ll i=0;i<x;i++)
		{
			for(ll j=0;j<y;j++)
			{
				cout<<s1[i][j];//打印图形
			}
		cout<<endl;
		}
		
	}
	return 0;
}

后缀表达式

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll a[60];
int main()
{

		string s;
		cin>>s;
		ll len=s.size();
	
	//	memset(a,0,sizeof(a));
		ll k=0;
		ll sum=0; 
		for(ll i=0;i<len;i++)
		{
			if(s[i]=='@')break;
			if(s[i]>='0'&&s[i]<='9')
			{
				sum=sum*10+s[i]-'0';
			}
			else if(s[i]=='.')
			{
				a[++k]=sum;
				sum=0;
			}
			
			else if(s[i]=='/')
			{
			
				a[k-1]=a[k-1]/a[k];
				
				k--;
			}
			else if(s[i]=='-')
			{
				
				a[k-1]=a[k-1]-a[k];
				
				k--;
			}
			else if(s[i]=='+')
			{
			
				a[k-1]=a[k-1]+a[k];
				
				k--;
			}
			else if(s[i]=='*')
			{
			
				a[k-1]=a[k-1]*a[k];
				
				k--;
			}
		}
		cout<<a[1]<<endl;
	
	return 0;
 } 

这一题相当于对栈的模拟
注意要++k不要k++,这样可以避免对数组的操作
接下来是用栈来做

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll a[60];
int main()
{

		string s;
		cin>>s;
		ll len=s.size();
	
	//	memset(a,0,sizeof(a));
		ll k=0;
		ll sum=0; 
		stack<ll>s1;
		for(ll i=0;i<len;i++)
		{
			if(s[i]=='@')break;
			if(s[i]>='0'&&s[i]<='9')
			{
				sum=sum*10+s[i]-'0';
			}
			else if(s[i]=='.')
			{
				s1.push(sum);
				sum=0;
			}
			
			else if(s[i]=='/')
			{
			
				ll x=s1.top();s1.pop();
				ll y=s1.top();s1.pop();
				s1.push(y/x);
				
			}
			else if(s[i]=='-')
			{
				
					ll x=s1.top();s1.pop();
				ll y=s1.top();s1.pop();
				s1.push(y-x);
				
			}
			else if(s[i]=='+')
			{
				ll x=s1.top();s1.pop();
				ll y=s1.top();s1.pop();
				s1.push(y+x);
				
			}
			else if(s[i]=='*')
			{
			
				ll x=s1.top();s1.pop();
				ll y=s1.top();s1.pop();
				s1.push(y*x);
				
			}
		}
		cout<<s1.top()<<endl;
	
	return 0;
 } 

合并果子
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll s[10010];
int main()
{
	ll n;
	cin>>n;
	for(ll i=0;i<n;i++)
	{
		cin>>s[i];
	}
	sort(s,s+n);
	ll ans=0;
	ll sum=s[1]+s[0];
	s[1]=sum;
	sort(s,s+n);
	ans=sum;
//	for(ll i=0;i<n;i++)
//	{
//		cout<<s[i]<<endl;
//	}
	for(ll i=1;i<n-1;i++)
	{
		sum=s[i+1]+s[i];
		s[i+1]=sum;
		ans+=sum;
		sort(s+1+i,s+n);
	//	cout<<ans<<endl;
	}
	cout<<ans<<endl;
	return 0;
}
  1. 第一次排序和计算
    sort(s,s+n);;
    对数组 s 中的前 n 个元素进行排序,使得数组元素按从小到大的顺序排列。
    ll ans=0;:
    定义一个长整型变量 ans,用于存储所有相加结果的总和,初始化为 0。
    ll sum=s[1]+s[0];:
    选取数组中最小的两个元素 s[0] 和 s[1] 相加,结果存储在变量 sum 中。
    s[1]=sum;:
    将相加结果 sum 放回数组 s 中,覆盖原来的 s[1]。
    sort(s,s+n);:
    再次对数组 s 进行排序,确保数组元素仍然按从小到大的顺序排列。
    ans=sum;:
    将第一次相加的结果 sum 赋值给 ans。
    . 后续循环计算
    for(ll i=1;i<n-1;i++):
    从第二个元素开始,循环 n - 2 次。
    sum=s[i+1]+s[i];:
    每次选取当前数组中最小的两个元素 s[i] 和 s[i + 1] 相加,结果存储在变量 sum 中。
    s[i+1]=sum;:
    将相加结果 sum 放回数组 s 中,覆盖原来的 s[i + 1]。
    ans+=sum;:
    将当前相加结果 sum 累加到 ans 中。
    sort(s+1+i,s+n);:
    对数组中从 s[i + 1] 开始到末尾的元素进行排序,确保数组元素仍然按从小到大的顺序排列。
    还有一个正解就是优先队列·
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main()
{
	ll n;
	cin>>n;
	priority_queue<ll,vector<ll>,greater<ll> >k;
	for(ll i=0;i<n;i++)
	{
		ll x;
		cin>>x;
		k.push(x);
	}
	ll ans=0;
	while(k.size()>1)
	{
		ll s=0;
		s+=k.top();
		k.pop();
		s+=k.top();
		k.pop();
		ans+=s;
		k.push(s);
	}
	cout<<ans<<endl;
	return 0;
 } 

priority_queue<ll,vector,greater >k;:定义一个优先队列k,它是一个小顶堆,即队列中的元素始终按照从小到大的顺序排列。greater表示使用大于比较函数,使得最小的元素总是位于队列的顶部。
for(ll i=0;i<n;i++):使用一个循环读取n个数字。
ll x;:声明一个long long类型的变量x,用于临时存储输入的数字。
cin>>x;:从标准输入读取一个整数,并将其赋值给变量x。
k.push(x);:将变量x的值插入到优先队列k中。
注意默认的为最大的在堆顶
ll ans=0;:声明一个long long类型的变量ans,用于存储合并的总代价,初始值为 0。
while(k.size()>1):当优先队列k中的元素数量大于 1 时,继续循环。
ll s=0;:声明一个long long类型的变量s,用于存储当前合并的两个最小数字的和,初始值为 0。
s+=k.top();:将优先队列k顶部的元素(即当前最小的元素)加到s中。
k.pop();:从优先队列k中移除顶部的元素。
s+=k.top();:将优先队列k新的顶部元素(即当前第二小的元素)加到s中。
k.pop();:从优先队列k中移除新的顶部元素。
ans+=s;:将当前合并的代价s累加到总代价ans中。
k.push(s);:将合并后的结果s插入到优先队列k中。
** EKO / 砍树**
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll MAX=1e6+1;
ll n,m;
ll s[MAX];
bool judet(ll x)
{
	ll sum=0;
	for(ll i=0;i<n;i++)
	{
		if(s[i]>=x)
		sum+=s[i]-x;
	}
	if(sum>=m)
	return true;
	else
	return false;
}
int main()
{
	cin>>n>>m;
	for(ll i=0;i<n;i++)
	{
		cin>>s[i];
	}
	ll let=1;
	ll ret=1e6;
	ll ans=0;
	while(let<=ret)
	{
		ll mid=let+(ret-let)/2;
		if(judet(mid))
		{
			ans=mid;
			let=mid+1;
		}
		else
		{
			ret=mid-1;
		}
	}
	cout<<ans<<endl;
	return 0;
}

bool judet(ll x):定义一个名为judet的函数,它接收一个long long类型的参数x,表示设定的截取高度,返回一个布尔值。
ll sum = 0;:声明一个long long类型的变量sum,用于存储按照高度x截取后得到的木材总长度,初始化为 0。
for (ll i = 0; i < n; i++):遍历每棵树。
if (s[i] >= x):如果当前树的高度s[i]大于等于设定的高度x。
sum += s[i] - x;:将这棵树超过x的部分累加到sum中。
if (sum >= m):如果截取得到的木材总长度sum大于等于需要的长度m。
return true;:返回true,表示这个高度x是可行的。
else:否则。
return false;:返回false,表示这个高度x不可行。
cin >> n >> m;:从标准输入读取树的数量n和需要截取的木材总长度m。
for (ll i = 0; i < n; i++):遍历每棵树。
cin >> s[i];:从标准输入读取每棵树的高度并存储到数组s中。
ll let = 1;:二分查找的左边界,初始化为 1。
ll ret = 1e6;:二分查找的右边界,初始化为1000000。
ll ans = 0;:用于存储最终的答案,即能截取到至少m长度木材的最大高度,初始化为 0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值