首页 > 其他分享 >AtCoder Beginner Contest 374(D-E)

AtCoder Beginner Contest 374(D-E)

时间:2024-10-08 19:23:20浏览次数:1  
标签:AtCoder Beginner int double maxn y1 x1 374 define

A-C:

惯例是宝宝题,会打暴力就能过哈

D:

其实也是暴力dfs,有一个double打错成int(我是猪鼻),卡了我很久

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

const int maxn = 1e3 + 10,eps=1e-7;
int n,s,t;
bool vis[10];
double sum=1e8;
struct Node{
	double x,y,x1,y1;
}a[maxn];
double dis(double x,double y,double x1,double y1){
	return sqrt(1.0*(x-x1)*(x-x1)+1.0*(y-y1)*(y-y1));
}
void dfs(double sm,int x,int y){
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			vis[i]=1;
			double tmp=dis(a[i].x,a[i].y,x,y);
			dfs(sm+tmp,a[i].x1,a[i].y1);
			tmp=dis(a[i].x1,a[i].y1,x,y);
			dfs(sm+tmp,a[i].x,a[i].y);
			vis[i]=0;
		}
		else cnt++;
	}
	if(cnt==n){
		if(sm-sum<eps)sum=sm;
		return;
	}
}
signed main(){
    cin>>n>>s>>t;
	double ans=0;
	for(int i=1;i<=n;i++){
		double x,y,x1,y1;cin>>x>>y>>x1>>y1;
		ans+=dis(x,y,x1,y1);
		a[i].x=x,a[i].y=y,a[i].x1=x1,a[i].y1=y1;
	}
	for(int i=1;i<=n;i++){
		vis[i]=1;
		double tmp=dis(0,0,a[i].x,a[i].y);
		dfs(tmp,a[i].x1,a[i].y1);
		tmp=dis(0,0,a[i].x1,a[i].y1);
		dfs(tmp,a[i].x,a[i].y);
		vis[i]=0;
	}
	ans=ans*1.0/t+sum*1.0/s;
	printf("%.7lf",ans);
}

E:

一开始以为是dp想了很久想不通。后来才发现是经典二分+DP。不过check部分还是要思考一下,要求生产数量大于mid在最优情况下能否实现。一种机器严格优于另一种机器是在\(A_i*B_i\)的条件下才会具备的,在这个结论下我们也会思考去先求出最大可取值k再暴力枚举剩下的部分。
这个做法是过不了hack数据的,因为我们并不能直接枚举剩余部分,剩余部分其实是不确定的(可能只取k-1然后再枚举取AB更优),所以做法最终为枚举剩余部分(最多只有ai或者bi个,因为超过一定换成更优的)用某个机器生产,剩下的用另一个机器生产的最小值。
代码很丑,建议看官解代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define int long long
using namespace std;
const int maxn=200;
int a[maxn],p[maxn],b[maxn],q[maxn],n,x;
bool jud(int mid){
    int sum=0;
    for(int i=1;i<=n;i++){
        int k=mid/(a[i]*b[i]);
        int res=mid-k*a[i]*b[i];
        int ans=1e18,ans2=1e18;
        int tte=0;
        for(int j=0;j<=b[i];j++){
            for(int m=0;m<=a[i];m++){
                if(a[i]*j+b[i]*m>=res)ans=min(ans,p[i]*j+m*q[i]);
            }
        }
        tte=ans+k*p[i]*b[i];
        if(k>0){
            res=mid-(k-1)*a[i]*b[i];
            for(int j=0;j<=b[i];j++){
                for(int m=0;m<=a[i];m++){
                    if(a[i]*j+b[i]*m>=res)ans2=min(ans2,p[i]*j+m*q[i]);
                }
            }
            tte=min(ans2+(k-1)*p[i]*b[i],tte);
        }
        sum+=tte;
        
        //if(mid==4)cout<<p[i]<<' '<<sum<<endl;
    }
    if(sum<=x)return 1;
    else return 0;
}
signed main(){
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>p[i]>>b[i]>>q[i];
        int v1=b[i]*p[i],v2=a[i]*q[i];
        if(v1>v2)swap(a[i],b[i]),swap(p[i],q[i]);
    }
    int l=0,r=1e9+7,mid=(l+r+1)/2;
    while(l<r){
        if(jud(mid))l=mid;
        else r=mid-1;
        mid=(l+r+1)/2;
    }
    cout<<mid<<endl;
}

F:

DP吧。不会

标签:AtCoder,Beginner,int,double,maxn,y1,x1,374,define
From: https://www.cnblogs.com/lyrrr/p/18452323

相关文章

  • キーエンスプログラミングコンテスト2024(AtCoder Beginner Contest 374)
    A.Takahashisan2判断一个字符串是否以san结尾usingnamespacereader;intmain(){strings;cin>>s;if(s[s.length()-1]=='n'ands[s.length()-2]=='a'ands[s.length()-3]=='s'){cout<<"Yes";......
  • abc374E Sensor Optimization Dilemma 2
    生产某种产品有N道工序,对于工序i,有S[i]和T[i]两类机器可供选择,机器S[i]单价为P[i],每台每天能处理A[i]件;机器T[i]单价为Q[i],每台每天能处理B[i]件。在不超预算X的前提下,每天最多能生产多少件产品?1<=N<=100;1<=A[i],B[i]<=100;1<=P[i],Q[i],X<=1E7分析:最大产能为所有工序的最小......
  • AtCoder Beginner Contest 355
    ABC355A-WhoAtetheCake?题目传送门代码(签到题)#include<cstdio>#include<cctype>#include<cstring>#include<algorithm>usingnamespacestd;intiut(){intans=0,f=1;charc=getchar();while(!isdigit(c))f=(c=='-'......
  • AtCoder Beginner Contest 373
    ABC373A-September题目传送门代码(签到题)#include<cstdio>#include<cstring>usingnamespacestd;chars[1111];intans;intmain(){for(inti=1;i<=12;++i){scanf("%s",s+1);if(strlen(s+1)==i)++ans;}pr......
  • Solution - Atcoder ARC116C Multiple Sequences
    一个\(\mathcal{O}(m^{\frac{3}{4}}\logm)\)做法。令\(a_0=1\)。对于倍数问题,考虑类似差分的思想,定义\(b_i=\frac{a_i}{a_{i-1}}(1\lei\len)\),那么合法的\(a\)和\(b\)是双射的,就只需要考虑对\(b\)计数了。考虑到因为有\(\prod\limits_{i=1}^nb_i\lem\)......
  • AT_abc374_f Shipping
    原题链接不难发现一次发出一定是\(a_i+kx,k\in\mathbb{Z}\)的时刻,因为你一次发出不然就是可以发出抓紧发出,否则肯定是要等到下一次有新包裹要发出再发出,不然你中间等待没意义。也就是说相当于从一个时刻开始连续发送若干次。设\(f_{i,j}\)为在第\(i\)个包裹到达时,总共有......
  • AtCoder Beginner Contest 374
    ABC374A-Takahashisan2题目传送门代码(签到题)#include<cstdio>#include<cctype>#include<cstring>#include<cmath>#include<queue>usingnamespacestd;intiut(){ intans=0,f=1;charc=getchar(); while(!isdigit(c))f=(c==&......
  • 题解:AT_abc374_c [ABC374C] Separated Lunch
    无耻的广告更好的阅读体验~最近在搞个人博客博客园的差点忘了更了。已经沦落到在写这种水题题解了。题目翻译有\(n\)队人,每个队人数不同,把他们分成2组(同一队的不能拆开),使两组人数差距尽量小。形式化题意:有\(n\)个数,把它们分成两组,使两组和的差尽量小。说句闲话:感觉这......
  • ABC374 E 题解
    ABC374E题解E-SensorOptimizationDilemma2题目链接:AT|洛谷容易发现答案可以二分。于是我们把问题转化为了判定性问题:给定目标\(x\),能否在花费不超过预算的情况下,使得每个过程的产量都不低于\(x\)?进一步,由于各个过程的生产互不相关,所以我们要尽可能让每个过程的费......
  • [题解]ABC374 A~E
    A-Takahashisan2直接判断字符串是否以san结尾即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings; cin>>s; intn=s.size(); if(s[n-1]=='n'&&s[n-2]=='a'&&s[n-3]=='s')cout<<&......