A.Infinity Gauntlet
六颗无限宝石,颜色和宝石属性用map维护然后标记查询即可,水题。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ins insert
map<string,string> inf;
map<string,bool> rec;
int main()
{
inf["green"]="Time";
inf["purple"]="Power";
inf["orange"]="Soul";
inf["red"]="Reality";
inf["yellow"]="Mind";
inf["blue"]="Space";
rec["green"]=0;
rec["purple"]=0;
rec["orange"]=0;
rec["red"]=0;
rec["yellow"]=0;
rec["blue"]=0;
int n;
cin>>n;
cout<<6-n<<endl;
while(n--)
{
string h;
cin>>h;
rec[h]=1;
}
for(auto p=rec.begin();p!=rec.end();p++)
{
if(p->second!=true)
{
cout<<inf[p->first]<<endl;
}
}
return 0;
}
B.High School: Become Human
这一题是给定两个正整数xx和,判断xyxy与yxyx的大小关系。
记得在高中做过一个数学归纳法的题目就是推导当y>x>2y>x>2且xx与均为整数,就有xy>yxxy>yx恒成立。那么这一题反过来用这个结论就可以知道,x=yx=y时,两者相等,当min(x,y)>2min(x,y)>2时,必然满足xy>yxxy>yx。最后,当min(x,y)=2 && max(x,y)=4min(x,y)=2 && max(x,y)=4时,有xy=yxxy=yx,而当min(x,y)=2 && max(x,y)=3min(x,y)=2 && max(x,y)=3或min(x,y)=1min(x,y)=1时,有xy<yxxy<yx。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
if(a==b||(a==2&&b==4)||(a==4&&b==2)) cout<<"=";
else if((a==2&&b==3)) cout<<"<";
else if((a==3&&b==2)) cout<<">";
else if(a==1||b==1)
{
if(a==1) cout<<"<";
else cout<<">";
}
else
{
if(a<b) cout<<">";
else cout<<"<";
}
return 0;
}
C.Three Displays
题意,依次给出Display的字体大小与价格,找出三个字体大小的递增序列,然后输出这个序列cost总和的最小值,若不存在这个序列就输出-1。数量n的范围:0<n<=30000<n<=3000
分析:
既然nn是小于等于3000,那么可以考虑算法。首先可以暴力枚举前两个广告牌,然后:若这两个广告牌的大小满足递增条件,则通过枚举第二个广告牌后面的广告牌也能在同样的n2n2时间内求出第三个满足递增且最便宜的广告牌(当然这里我们可以预处理出前n−1n−1个广告牌的后面的满足递增的最小cost的index记录数组)。这样n2n2的时间内的枚举就能求解。时间复杂度:O(n2)O(n2)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int font[3002];
int cost[3002];
int af[3002];
for(int i=0;i<n;i++)
{
cin>>font[i];
}
for(int i=0;i<n;i++)
{
cin>>cost[i];
}
for(int i=0;i<n-1;i++)
{
int lw=100000001;
int idx=-1;
for(int j=i+1;j<n;j++)
{
if(font[j]>font[i]&&cost[j]<lw)
{
idx=j;
lw=cost[j];
}
}
af[i]=idx;
}
int mincost=2000000000;
for(int i=0;i<n-2;i++)
{
for(int j=i+1;j<n-1;j++)
{
if(font[i]<font[j])
{
int sum=cost[i]+cost[j];
if(af[j]!=-1)
{
sum+=cost[af[j]];
if(sum<mincost) mincost=sum;
}
}
}
}
if(mincost!=2000000000)
cout<<mincost;
else cout<<-1;
return 0;
}