求助,下载样例测是对的但是交上去就全WA
查看原帖
求助,下载样例测是对的但是交上去就全WA
400468
Aakkosetsumussa楼主2023/8/4 21:00

由于不会直接仿着题解第一篇认真抄了一遍,但是不知道哪里有问题 ,求大佬指点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ull maxn=10005;
inline int read(void);
inline void write(int x);
struct node {
	int a, b, l;
	char cnta[maxn], all[maxn];
	char ca[maxn], ans[maxn];
} E[1001];
bool cmp1(node a, node b) {
	return a.a*a.b<b.a*b.b;
}
bool cmp2(node a, node b) {
	if(a.l!=b.l) return a.l>b.l;
	else for(int i=0; i<a.l; i++) if(a.ans[i]!=b.ans[i]) return a.ans[i]>b.ans[i];
	return 1;
}
inline void doit(int a, char b[]) {
	int len=0;
	while(a>0) b[len++]=a%10+'0', a/=10;
	b[len]='\0';
}
inline void add(char c[], char d[], int k) {
	int len=strlen(c), tmp, s;
	for(int j=0; j<len; j++, k++) {
		tmp=(d[k]>0? d[k]-'0':0)+c[j]-'0'+s;
		d[k]=tmp%10+'0', s=tmp/10;
	}
	if(s) d[k++]=s+'0';
	d[k]='\0';
}
inline void gc(char a[], char b[], char d[]) {
	int lena=strlen(a), lenb=strlen(b);
	char c[maxn];
	for(int i=0; i<lena; i++) {
		int tmp, s=0, lenc=0;
		for(int j=0; j<lenb; j++) {
			tmp=(a[i]-'0')*(b[j]-'0')+s;
			c[lenc++]=tmp%10+'0', s=tmp/10;
		}
		if(s) c[lenc++]=s+'0';
		c[lenc]='\0', add(c, d, i);
	}
}
void divi(char a[], int b, char c[]) {
	int i=0, tag=0, lena=strlen(a), lenc=0, d=0;
	while(i<=lena)
		if(b>d) {
			d=d*10+a[i++]-'0';
			if(tag) c[lenc++]='0';
		} else {
			c[lenc++]=d/b+'0';
			d=d%b;
			d=d*10+a[i++]-'0';
			tag=1;
		}
	if(tag==0) c[lenc++]='0';
	c[lenc]='\0';
}
int n, ANS=1;
int main() {
	cin>>n;
	for(int i=0; i<=n; i++) cin>>E[i].a>>E[i].b;
	sort(E+1, E+n+1, cmp1);
	doit(E[0].a, E[0].ca);
	E[0].cnta[0]='1', E[0].cnta[1]='\0';
	for(int i=1; i<=n; i++) {
		doit(E[i].a, E[i].ca);
		gc(E[i-1].cnta, E[i-1].ca, E[i].cnta);
	}
	for(int i=1; i<=n; i++) {
		int k=0;
		for(int j=strlen(E[i].cnta)-1; j>=0; j--) E[i].all[k++]=E[i].cnta[j];
		E[i].all[k]='\0';
	}
	for(int i=1; i<=n; i++) {
		divi(E[i].all, E[i].b, E[i].ans);
		E[i].l=strlen(E[i].ans);
	}
	for(int i=2; i<=n; i++) if(!cmp2(E[ANS], E[i])) ANS=i;
	printf("%s\n", E[ANS].ans);
	return 0;
}
inline int read(void) {
	int x=0,  f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
inline void write(int x) {
	if(x<0) x=-x, putchar('-');
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

2023/8/4 21:00
加载中...