AtCoder Beginner Contest 153 Solution Report

Portal

A Serval vs Monster

Solution: Divide the two and round up.

B Common Raccoon vs Monster

Solution: Put all nnn- likea [i] a [i]a [ i ] add together, andhhh can be compared.

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
int h,n,x;
int main()
{
    
    
    cin>>h>>n;
	int ans=0;
	rep(i,1,n)cin>>x,ans+=x;
	if(ans>=h)puts("Yes");
	else puts("No");
    return 0;
}

C Fennec vs Monster

Solution: Sort, remove the big one to 0, and add up the rest to get the answer

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
ll n,k,h[200005];
int main()
{
    
    
    cin>>n>>k;
	rep(i,1,n)cin>>h[i];
	sort(h+1,h+n+1);
	ll ans=0;
	int lim=max(0ll,n-k);
	rep(i,1,lim)ans+=h[i];
	cout<<ans<<endl;
    return 0;
}

D Caracal vs Monster

Problem solution: can be transformed into several 2 2Power of 2 addition

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
ll h;
int main()
{
    
    
    cin>>h;
	ll ans=0;
	int tot=1;
	while(h>=1){
    
    
		ans+=pow(2,tot-1);
		h=h/2;
		tot++;
	}
	cout<<ans<<endl;
    return 0;
}

E Crested Ibis vs Monster

Solution: It can be transformed into a complete knapsack problem. The life value is regarded as a volume, and the minimum cost to be achieved can be doubled

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e3+5;
int h,n,a[N],b[N],f[25000];
int main()
{
    
    
    cin>>h>>n;
	rep(i,1,n)cin>>a[i]>>b[i];
	mm(f,inf);
	f[0]=0;
	rep(i,1,n)rep(j,a[i],h+10000){
    
    
		f[j]=min(f[j],f[j-a[i]]+b[i]);
	}
	int ans=inf;
	rep(i,h,h+10000)ans=min(ans,f[i]);
	cout<<ans<<endl;
    return 0;
}

F Silver Fox vs Monster

Solution: I used a linked list at the beginning, TTT is in the last two groups. Finally, I thought about using the queue for maintenance. First, it is necessary to scan from left to right, but it must be maintained at this time. This will affect the future, and these effects can also be put into the queue In the middle, then add a total mark to the queue, if the left mark has not been reached, then dequeue, delete the total mark and dequeue.

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=2e5+5;
ll n,d,a;
pair<ll,ll>dots[N];
queue<pair<ll,ll> >q;
int main()
{
    
    
    cin>>n>>d>>a;
	rep(i,1,n)cin>>dots[i].fi>>dots[i].se;
	sort(dots+1,dots+n+1);
	ll sum=0,ans=0;
	rep(i,1,n){
    
    
		int lim=dots[i].fi-d;
		while(!q.empty()){
    
    
			pair<ll,ll> u=q.front();
			if(u.fi<lim){
    
    
				sum-=u.se;
				q.pop();
			}else break;
		}
		dots[i].se-=min(dots[i].se,sum*a);
		if(dots[i].se){
    
    
			q.push({
    
    dots[i].fi+d,ceil(dots[i].se*1.0/a)});
			ans+=ceil(dots[i].se*1.0/a);
			sum+=ceil(dots[i].se*1.0/a);
			dots[i].se=0;
		}
	}
	cout<<ans<<endl;
    return 0;
}

Guess you like

Origin blog.csdn.net/zhouzi2018/article/details/104089875