A. Integer Moves
分析
题意是说给一个点,计算到这个点的最少次数,每次移动距离为整型。只有三种情况,起点,直线距离为整型,直线距离不为整型,分别对应步数0,1,2。
注意,判断直线距离是否为整型时,sqrt()函数开出来的不是整型,需要用到强制类型转化。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=10007;
const ll MAX=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y;
cin>>x>>y;
if(x==0&&y==0) cout<<"0"<<endl;
else if((int)sqrt(x*x+y*y)*(int)sqrt(x*x+y*y)==x*x+y*y) cout<<"1"<<endl;
else cout<<"2"<<endl;
}
return 0;
}
B. XY Sequence
分析
模拟题目要求比较,输出结果即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=10007;
const ll MAX=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,b,x,y;
cin>>n>>b>>x>>y;
ll ans=0,a=0;
for(int i=1;i<=n;i++)
{
if(a+x>=a-y)
{
if(a+x<=b)
{
a+=x;
}
else {
a-=y;
}
}
else {
if(a-y<b) a-=y;
else a+=x;
}
ans+=a;
}
cout<<ans<<endl;
}
return 0;
}
C. Bracket Sequence Deletion
分析
遇到两个相同的括号,或者括号之间构成回文,即可消除,输出消除后的字符串。
本来想用栈和队列模拟操作消除,后来发现不需要这么麻烦。就两种情况,一种是(),((,))可直接消除,另一种是)(需要找到下一个)就可以消除,遍历一遍就可以了。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=10007;
const ll MAX=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
string s;
int ans=0;
cin>>n;
cin>>s;
int i;
for(i=0;i<n-1;)
{
if((s[i]=='('&&s[i+1]==')')||(s[i]=='('&&s[i+1]=='(')||(s[i]==')'&&s[i+1]==')'))
{
ans++;
i+=2;
}
else if(s[i]==')'&&s[i+1]=='(')
{
int c=i;
i+=2;
while(i<n)
{
if(s[i]==')')
{
break;
}
else {
i++;
}
}
if(i<n&&s[i]==')')
{
i++;
ans++;
}
else {
i=c;
break;
}
}
}
cout<<ans<<" "<<n-i<<endl;
}
return 0;
}
D. For Gamers. By Gamers.
分析
给你n类士兵,他们的花费,伤害,生命分别是c,d,h,每次只能用一种士兵去打怪物,一共有m个怪物,每个怪物的伤害和生命是D,H。每种士兵可以召唤多个,每次打怪物士兵不能全死掉,每次选择士兵,希望可以用最少的金币有最大的效率,输出召唤一个该士兵需要的花费。
题意很具有迷惑性,如果没有注意到只能用一种士兵的话,可能就会想到背包,但他是一种,就是比较了。首先想到的肯定是,暴力比较(这样肯定会TLE),所以需要对数据进行一些维护。
按照题意, t为需要士兵个数,对这个公式进行一些转化
,因为都是整数,可以对不等式右半部分-1,而填上等号
(首先这个不等式成立,所以D*H最大值为di*hi*t-1)。这样只需要对每个ci,计算最大的di*hi,再枚举每个di*hi*t-1(这里可以使用倍增),最后二分查找一下答案。我这里使用了lower_bound()函数。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e6+10;
const ll mod=10007;
const ll MAX=0x3f3f3f3f;
const double pi=acos(-1);
ll c[maxn],d[maxn],h[maxn];
ll da[maxn],kb[maxn];
int main()
{
int n,m,C;
cin>>n>>C;
for(int i=1;i<=n;i++)
{
cin>>c[i]>>d[i]>>h[i];
da[c[i]]=max(da[c[i]],d[i]*h[i]);
}
for(int i=1;i<=C+1;i++)
{
for(int j=i;j<=C;j+=i)
{
kb[j]=max(kb[j],(j/i)*da[i]-1);
}
}
for(int i=1;i<=C;i++)
{
kb[i]=max(kb[i-1],kb[i]);
}
cin>>m;
for(int i=1;i<=m;i++)
{
ll D,H;
cin>>D>>H;
ll t=D*H;
int ans=lower_bound(kb,kb+C+1,t)-kb;
if(ans>C) cout<<"-1\n";
else cout<<ans<<endl;
}
return 0;
}