題意:傳送門
題解:分類如果按照上的話就是最樸素的,但是卻卡我半天,題意也是強調(一臉苦)得用四捨五入,那麼四捨五入的小trick都有哪些呢?首先了解有個函數,但是可能也能直接用,這篇文章這樣其實對編程而言也沒啥非得糾結,另外一種就是比如直接將四捨五入到整數,那麼x=(x*1+0.5)/1.0
,那麼四捨五入到幾位小數也就有的寫了,x=(x*100+0.5)/100.0
就是保留兩位小數。
附上代碼(直接使用round函數):
#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 fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=70;
db stus[N][10];
int n;
db sum;
int main()
{
sc(n);
rep(i,1,n){
rep(j,1,8){
db t;
scanf("%lf",&t);
if(j==2&&stus[i][1]!=2)sum+=t;
stus[i][j]=t;
}
if(stus[i][1]==2)stus[i][9]=0;
else{
stus[i][9]+=round(stus[i][3]*stus[i][4]+stus[i][5]*stus[i][6]+stus[i][7]*stus[i][8]);
}
}
db res=0;
rep(i,1,n){res+=stus[i][9]*(stus[i][2]/sum);}
printf("%.2f\n",res);
return 0;
}
第二種:自己手動四捨五入
#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 fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=70;
db stus[N][10];
int n;
db sum;
int main()
{
sc(n);
rep(i,1,n){
rep(j,1,8){
db t;
scanf("%lf",&t);
if(j==2&&stus[i][1]!=2)sum+=t;
stus[i][j]=t;
}
if(stus[i][1]==2)stus[i][9]=0;
else{
for(int k=3;k<=7;k+=2){
stus[i][9]+=stus[i][k]*stus[i][k+1];
}
}
}
db res=0;
rep(i,1,n){
int g=(int)(stus[i][9]*1+0.5)/1.0;
res+=(g*(stus[i][2]/sum));
}
res=(int)(res*100+0.5)/100.0;
printf("%.2f\n",res);
return 0;
}