文章目录
A 装备二选一(一)
题目描述
手中的武器会为他增加 a% 的暴击率,发生暴击时会使他本次普通攻击伤害变为原来的 b 倍。
打完boss之后掉落的武器会为他增加 c% 的暴击率,发生暴击时会使他本次普通攻击伤害变为来的 d倍。
思路
就是比较一下伤害
代码
int main()
{
double a, b, c, d;
cin >> a >> b >> c >> d;
double bc = 1.0 + a / 100.0 * (b - 1.0);//基础伤害+发生暴击时的伤害
double bn = 1.0 + c / 100.0 * (d - 1.0);
if (bn > bc)
cout << "YES";
else
cout << "NO";
return 0;
}
B 百变吗喽
题目描述
两个字符串,第一个比第二个少一个字母,在任意一个地方添加一个字母两个字符串是否能一样
思路
判断一下两个字符串在缺少的地方之前或者后面是否完全一样,如果一样证明可以添加一个字母之后完全一样,就在这个地方添加就行,不然直接输出0
代码
int main()
{
string s,t;int i,j;
cin>>s>>t;
s=" "+s;//因为从一开始,从0就不用
t=" "+t;
for( i=1;i<=s.size()&&s[i]==t[i];i++);//两个循环判断可以添加的区间
for( j=t.size();j>=1&&s[j-1]==t[j];j--);
if(j<=i)
{
cout<<i-j+1<<endl;
for(int k=j;k<=i;k++)//区间内完成添加
cout<<k-1<<' '<<t[k]<<endl;
}
else
cout<<0<<endl;
return 0;
}
C 16进制世界
题目描述
有n个月饼,对于每个月饼i,饱食度为v i ,幸福度𝑤𝑖 。现在有m饱度,意味着他吃的月饼的饱食度之和不大于m。但是由于身处16进制的世界,他吃的月饼的幸福度之和必须是16的倍数。算一下最多吃的月饼的量。
思路
背包思想如果两个数 加起来是的倍数,只需要 模 的余数加起来是 的倍数,同理可以拓展到多个数相加以及递归地将 拆成其他几个数的和。这样我们的就没必要存储幸福度,而只需要存储幸福度模 后的余数即可。
代码
int main()
{
long long n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
y=y%16;//求余
for(int j=m;j>=x;j--)
for(int k=15;k>=0;k--)
{
long long ne=(k-y+16)%16;
if(dp[j-x][ne]||ne==0)//更新最大值
dp[j][k]=max(dp[j][k],dp[j-x][ne]+1);
}
}
cout<<dp[m][0];
return 0;
}
D 四散而逃
题目描述
一个由n个格子排成一行的走廊,每个格子有a个人,每次可以从一个格子同时向两边跑(两个人必须是同一个格子)多少次可以都在两边
思路
当n=3,中间是奇数的时候就不行了,偶数可以,n>3中间只要有一个大于1,就可以,因为可以向它两边的任意位置跑,但是中间有奇数计算数量要多一次
代码
long long a[200600];
signed main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int res = 0, sum = 0;
for (int i = 1; i < n - 1; i++)
sum += a[i]/2;计算总数
int ff=0;
for (int i = 1; i < n - 1; i++)
if(a[i]>1)//判断是否有大于1的数
ff=1;
for (int i = 1; i < n - 1; i++)
if (a[i] % 2!= 0)
res++;//奇数+1;
res=res+sum;
if ((n == 3 && a[1] % 2!= 0)||ff==0) //n=1特判
res = -1;
cout << res << '\n';
return 0;
}
F 追寻光的方向
题目描述
小G所在的道路上排列着n个路灯,每个路灯发出的光亮为li 。由于视野问题,每次只能看到前方最亮的那盏灯的位置,(若前方有多个亮度值最大,则只会跑到第一个亮度值最大的位置)所以小G每次冲到最亮的那盏灯下,然后进行一次休息。现如今小G正在第一个路灯下,小G到达第n个路灯下,需要休息几次?
思路
可以倒着看看一下比最后一个数大或者等于它的有多少,当遇到的时候更新一下最后这个数的值,作最大值
代码
signed main()
{
int n;
cin>>n;
int a[n+30];
for(int i=0;i<n;i++)
cin>>a[i];
int ans=0;
int maxx=a[n-1];
for(int j=n-1;j>=1;j--)
{
if(a[j]>=maxx)
ans++;//更新数量
maxx=max(maxx,a[j]);
}
cout<<ans-1;//算出的是最大值的台灯数,问的是休息几次,所以最后减一
return 0;
}
}
G 等公交车
题目描述
多个公交站点,一个人到达某个站点时,等待几分钟共交车能够到达
思路
首先判断一下,完全赶不上的,然后判断最近时刻的车是否能赶上
代码
const int N=1e5+11;
int d[N],t[N];
int main()
{
int n,m;int q;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>d[i];
for(int i=1;i<=m;i++) cin>>t[i];
cin>>q;
while(q--)
{
int tt,x;
cin>>tt>>x;
int s=d[x]+t[m];//最晚的车人需要几分钟到达站点等待
if(tt>s) cout<<"TNT"<<'\n';
else
for(int i=1;i<=m;i++)
if(d[x]+t[i]>=tt)//判断最短时间的
{
cout<<d[x]+t[i]-tt<<'\n';
break;
}
}
return 0;
}