计蒜客信息学入门赛 #3 题解

A
原题链接:https://www.jisuanke.com/contest/2759/219462
题解:
由于血量为b,每张卡牌伤害为a,所以直接输出b/a(向上取整即可)

AC代码:

#include 

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
   	cout.tie(0);
    int a,b;
    cin>>a>>b;
    cout<<(b+a-1)/a<

B
原题连接:https://www.jisuanke.com/contest/2759/219463
题解:
按顺序出牌,所以当前k张牌的总伤害值大于等于b时,答案即为k。

AC代码:

#include 

using namespace std;

#define LL long long

const int maxn=1e6+5;

int a[maxn];
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
   	cout.tie(0);
    int n;
    LL b,sum=0;
    int ans=-1;
    cin>>n>>b;
    for(int i=0;i>a[i];
        sum+=a[i];
        if(sum>=b&&ans==-1)
        {
            ans=i+1;
        }
    }
    cout<

C
原题链接:https://www.jisuanke.com/contest/2759/219464
题解:
略带点贪心,只要我选取了魔法值为b的卡牌,那么选上所有魔法值大于b的卡牌必然会使结果更大,所以将所有的卡牌,按照魔法值从大到小排序,从大到小取魔法值b并且乘上所有魔法值大于等于b的卡牌的能量值之和,以此比较取最大值即可。时间复杂度O(n)。注意开longlong,否则后仨点会WA。
AC代码:

#include 

using namespace std;

#define LL long long

const int maxn=1e6+5;

struct node
{
    LL a,b;
}st[maxn];


LL f[maxn],m[maxn];

bool cmp(node x, node y)
{
    if(x.b==y.b)
        return x.a>y.a;
    return x.b>y.b;
}

int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
   	cout.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>st[i].a>>st[i].b;

    sort(st+1,st+n+1,cmp);

    f[0]=0,m[0]=1e8+5;
    LL mx=0;
    for(int i=1;i<=n;i++)
    {
        f[i]=f[i-1]+st[i].a;
        m[i]=min(m[i-1],st[i].b);
        if(mx

D
原题链接:https://www.jisuanke.com/contest/2759/219465
题解:
最大的能量值对应最大的魔法值即可,注意开longlong,否则后俩点会WA。
AC代码:

#include 

using namespace std;

#define LL long long

const int maxn=1e6+5;

LL a[maxn],b[maxn];
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
   	cout.tie(0);
    int n;
    cin>>n;
    for(int i=0;i>a[i]>>b[i];
    sort(a,a+n);
    sort(b,b+n);
    LL sum=0;
    for(int i=0;i

欢迎评论!

你可能感兴趣的:(签到题或水题)