列表

详情


NC25556. 华华陪奕奕打怪兽

描述

奕奕又在打怪兽啦。怪兽初始时有C单位血量,奕奕每次攻击可以使怪兽减少一单位血量。每秒钟奕奕都可以攻击无限多次。奕奕每秒钟的状态不同。定义一个无限长的数组a和一个整数n,并且若i>n,有a[i]=a[i-n],所以只需知道1<=i<=n时a[i]的值就可以还原出整个数组。a[i]表示奕奕在第i秒时的状态值。另外奕奕还有疲劳值,因为每秒钟奕奕都可以攻击无限多次,所以会感到疲劳。定义一个长度为C的数组b,b[i]表示在一秒内第i次攻击怪兽时奕奕的疲劳值,所以b数组是不严格递增的。所以若奕奕第i秒内第j次攻击怪兽需要耗费精力值a[i]*b[j]。开始时奕奕的精力值为W,且奕奕的精力值始终不能小于等于0,同样地,若怪兽的血量小于等于0则奕奕赢得游戏。因为奕奕急着跟华华去看《复联4》,奕奕想知道她赢得游戏的最短时间。若奕奕无法赢得游戏,输出"-1",否则输出赢得游戏的最短时间。

输入描述

第一行输入n,C,W
第二行输入n个数,表示a数组的前n项
第三行输入C的数,表示b数组
1<=n,C<=1e5,1<=W<=1e18
1<=a[i],b[i]<=1e5
b[1]<=b[2]<=b[3]...<=b[C]

输出描述

输出一个整数表示答案

示例1

输入:

3 2 10
4 5 1
1 2

输出:

2

示例2

输入:

3 2 3
4 5 1
1 2

输出:

6

示例3

输入:

3 2 4
4 5 1
1 2

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 1546ms, 内存消耗: 7372K, 提交时间: 2019-05-19 23:20:31

#include <bits/stdc++.h>
#define mp make_pair
#define pii pair<int,int>
using namespace std;
typedef long long ll;
#define rint register int
const int maxn=100007;
const int inf=(1LL<<29);
ll t[maxn],a[maxn],b[maxn];
struct point{
    int pos,c;ll t;
    point(int pos,ll t,int c):pos(pos),t(t),c(c){}
    bool operator < (point x) const{
        return 1LL*a[pos]*b[c]>1LL*a[x.pos]*b[x.c];
    }
};
int main(){
    //cin.tie(0);ios_base::sync_with_stdio(false);
    int n,c;long long w;cin>>n>>c>>w;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=c;i++) cin>>b[i];
    ll l=0,r=1e12;
    ll ans=-1;
    while(l<=r){
        int now=c;
        priority_queue<point> q;
        ll mid=(l+r)>>1;
        for(int i=1;i<=n;i++){
            t[i]=mid>=i?(mid-i)/n+1:0;
        }
        for(int i=1;i<=n;i++){
            if(t[i]) q.push(point(i,t[i],1));
        }
        ll z=w;
        while(now&&q.size()){
            point p=q.top();q.pop();p.t--;
            z-=1LL*a[p.pos]*b[p.c];
            if(!p.t) p.t=t[p.pos],p.c++;
            q.push(p);
            now--;
        }
        //cout<<z<<" "<<now<<endl;
        if(z>0&&!now) r=mid-1,ans=mid;
        else l=mid+1;
    }
    cout<<ans;
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 597ms, 内存消耗: 6988K, 提交时间: 2020-03-30 22:20:08

#include<bits/stdc++.h>
using namespace std;

struct node
{
	long long x,y,num;
	bool operator<(const node &a)const
	{
		return a.num<num; 
	} 
}r,f;
long long n,m,w,a[100005],b[100005];
priority_queue<node>q,Q;
bool judge(long long time)
{
	long long i,s=0,c=0;
	Q=q;
	while(!Q.empty())
	{
		f=Q.top(),Q.pop();
		i=time/n+(f.x<=time%n?1:0);
		if(!i)continue;
		if(m-c>=i)
		{
			c+=i,s+=f.num*i;
			if(f.y+1<=m)r.x=f.x,r.y=f.y+1,r.num=a[f.x]*b[f.y+1],Q.push(r);
		}
		else
		{
			s+=(m-c)*f.num;
			break;
		}
		if(s>=w)break;
	}
	if(s<w)return 1;
	return 0;
}
int main() 
{
    long long i,L,R,Mid,ans=-1;
	scanf("%lld%lld%lld",&n,&m,&w);
    for(i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(i=1;i<=m;i++)scanf("%lld",&b[i]);
    for(i=1;i<=n;i++)r.x=i,r.y=1,r.num=a[i]*b[1],q.push(r);
    for(L=1,R=n*m;L<=R;)
	{
		Mid=(L+R)>>1;
		if(judge(Mid))ans=Mid,R=Mid-1;
		else L=Mid+1;
	}
	printf("%lld\n",ans);
    return 0;
}

上一题