题目链接:点击打开链接
题目大意:略。
解题思路:见注释,注意最后精度必须严格控制。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
struct node
{
int e;
double d;
}nds[maxn], tnds[maxn], rnds[maxn];
set<int,greater<int>> st;
int main()
{
int n,m,e,te;
double d,td;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%lf",&e,&d);
st.insert(e);
tnds[e].e=e;
tnds[e].d=d;
}
scanf("%d",&m);
for(int i=0;i<m;i++) scanf("%d%lf",&nds[i].e,&nds[i].d);
int l=0, k=0;
while(1)
{
auto it=st.begin();
e=*it;
if(e<nds[0].e) break; // 如果被除项最高次小于除项的最高次 break
te=tnds[e].e, td=tnds[e].d;
rnds[l].e=(te-=nds[0].e); // 记录商
rnds[l++].d=(td/=nds[0].d);
for(int i=0;i<m;i++) // 更新被除项(最终为余项)
{
e=nds[i].e+te;
d=nds[i].d*td;
tnds[e].d-=d;
tnds[e].e=e;
st.insert(e);
}
st.erase(st.begin()); // 每次消除最大
}
for(int i=0;i<l;i++) if(fabs(rnds[i].d)>4*1e-2) k++;
if(k==0) puts("0 0 0.0");
else
{
printf("%d",k);
for(int i=0;i<l;i++)
if(fabs(rnds[i].d)>4*1e-2) printf(" %d %.1f",rnds[i].e,rnds[i].d);
puts("");
}
l=0;
for(int i=nds[0].e-1;i>=0;i--) if(fabs(tnds[i].d)>4*1e-2) l++;
if(l==0){puts("0 0 0.0"); return 0;}
printf("%d",l);
for(int i=nds[0].e-1;i>=0;i--)
if(fabs(tnds[i].d)>4*1e-2) printf(" %d %.1f",tnds[i].e,tnds[i].d);
puts("");
return 0;
}