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;
}
- 第一次排序和计算
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。