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
这一题是给定两个正整数
x
x
和,判断
xy
x
y
与
yx
y
x
的大小关系。
记得在高中做过一个数学归纳法的题目就是推导当
y>x>2
y
>
x
>
2
且
x
x
与均为整数,就有
xy>yx
x
y
>
y
x
恒成立。那么这一题反过来用这个结论就可以知道,
x=y
x
=
y
时,两者相等,当
min(x,y)>2
m
i
n
(
x
,
y
)
>
2
时,必然满足
xy>yx
x
y
>
y
x
。最后,当min(x,y)=2 && max(x,y)=4
min(x,y)=2 && max(x,y)=4
时,有
xy=yx
x
y
=
y
x
,而当min(x,y)=2 && max(x,y)=3
min(x,y)=2 && max(x,y)=3
或
min(x,y)=1
m
i
n
(
x
,
y
)
=
1
时,有
xy<yx
x
y
<
y
x
。
代码:
#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<=3000 0 < n <= 3000
分析:
既然
n
n
是小于等于3000,那么可以考虑算法。首先可以暴力枚举前两个广告牌,然后:若这两个广告牌的大小满足递增条件,则通过枚举第二个广告牌后面的广告牌也能在同样的
n2
n
2
时间内求出第三个满足递增且最便宜的广告牌(当然这里我们可以预处理出前
n−1
n
−
1
个广告牌的后面的满足递增的最小cost的index记录数组)。这样
n2
n
2
的时间内的枚举就能求解。时间复杂度:
O(n2)
O
(
n
2
)
。
#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;
}