两份代码为什么一个能A,一个就wa了呢??
查看原帖
两份代码为什么一个能A,一个就wa了呢??
686187
pumaway楼主2022/8/23 16:25

A的


#include <bits/stdc++.h>
using namespace std;
//#define MAXN 100010
#define rep(i,a,n) for (int i=a;i<=n;++i)
#define per(i,a,n) for (int i=n;i>=a;--i)
#define rep0(i,n) for(int i=0;i<n;++i)
#define INF 1000000000
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define pob pop_back
#define all(x) (x).begin(),(x).end()
#define ent cout<<'\n'
//const int N = ;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int, int> pii;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline void read(int &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
inline void read(ll &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
inline void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
#define print(x) if(x==0)putchar('0');else write(x)
int a[200010],b[200010];
int n,p;
ll sum;
double l=0,r=1e10;

bool check(double mid)
{
	double mv=p*mid;
	double sum=0;
	rep(i,1,n)
	{
		if(a[i]*mid <= b[i])
			continue;
		else
			sum+= a[i]*mid-b[i];
	}
	return sum<=mv;
	
}
int main()
{
	read(n),read(p);
	rep(i,1,n)
	{
		read(a[i]),read(b[i]);
		sum+=a[i];
	}
	if(sum<=p)
	{
		puts("-1");
		return 0;
	}

	while(r-l>1e-6)
	{
		double mid=(l+r)/2;
		if(check(mid)) 
			l=mid;
		else
			r=mid;
	}

	printf("%.10f",l);

	return 0;
}

wa code


#include <bits/stdc++.h>
using namespace std;
//#define MAXN 100010
#define rep(i,a,n) for (int i=a;i<=n;++i)
#define per(i,a,n) for (int i=n;i>=a;--i)
#define rep0(i,n) for(int i=0;i<n;++i)
#define INF 1000000000
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define pob pop_back
#define all(x) (x).begin(),(x).end()
#define ent cout<<'\n'
//const int N = ;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int, int> pii;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline void read(int &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
inline void read(ll &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
inline void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
#define print(x) if(x==0)putchar('0');else write(x)
int a[200010],b[200010];
int n,p;
ll sum;
double l=0,r=1e8;

bool check(double mid)
{
	double mv=p*mid;
	double sum=0;
	rep(i,1,n)
	{
		if(a[i]*mid <= b[i])
			continue;
		else
			sum+= a[i]*mid-b[i];
	}
	return sum<=mv;
	
}
int main()
{
	read(n),read(p);
	rep(i,1,n)
	{
		read(a[i]),read(b[i]);
		sum+=a[i];
	}
	if(sum<=p)
	{
		puts("-1");
		return 0;
	}

	while(r-l>1e-8)
	{
		double mid=(l+r)/2;
		if(check(mid)) 
			l=mid;
		else
			r=mid;
	}

	printf("%.10f",l);

	return 0;
}









2022/8/23 16:25
加载中...