全场有9个题可以做。
A题,水题。注意细节。
B题。注意读题,然后排序两次就ok了。
C题。不会。
D题。理想气体状态方程。一直wa不过,忽略了pV=nrT如果等式两边同时有两个0的话等式在一切情况都成立。
E题。dancling links。
F题。圆面积交,乱搞就对了。居然因为模板错误而没有过掉。
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 1000003
#define maxm
#define eps
#define pp
#define inf 0x3f3f3f3f
#define re freopen("in.txt","r",stdin)
#define PI acos(-1.0)
//double area(double dis,double r1,double r2){
// if(r1+r2<dis)return 0;
// double ans=0;
// dis/=2;
// double ta=sqrt(r1*r1-dis*dis);
// double alpha1=2*acos(dis/r1);
// double tran1=dis*ta;
// double shan1=alpha1*r1*r1/2;
//
// double tb=sqrt(r2*r2-dis*dis);
// double alpha2=2*acos(dis/r2);
// double tran2=dis*tb;
// double shan2=alpha2*r2*r2/2;
//
// return shan1+shan2-tran1-tran2;
//}
double area(double d, double r1, double r2)
{
if (d>=r1+r2) return 0;
if (r2<r1) swap(r1, r2);
if (d<=r2-r1) return PI*r1*r1;
double a = d, b = r1, c = r2;
double cta1 = acos((a * a + b * b - c * c) / 2 / (a * b)),
cta2 = acos((a * a + c * c - b * b) / 2 / (a * c));
double s1 = r1*r1*cta1 - r1*r1*sin(cta1)*(a * a + b * b - c * c) / 2 / (a * b);
double s2 = r2*r2*cta2 - r2*r2*sin(cta2)*(a * a + c * c - b * b) / 2 / (a * c);
return s1 + s2;
}
int main(){
// re;
double d,r1,R1,r2,R2;
cin>>d>>r1>>R1>>r2>>R2;
double total=area(0,R1,R1)-area(0,r1,r1)+area(0,R2,R2)-area(0,r2,r2);
double sub=area(d,R1,R2)-area(d,R1,r2)-(area(d,r1,R2)-area(d,r1,r2));
total-=sub;
printf("%.6lf\n",total);
return 0;
}
G题。贪心。每次过河的时候四个四个一组考虑。可以每次用最小的带最大的过去最小的再回来,也可以最小的两个故去,最小的回来,最大的两个过去,次小的回来。
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 105
#define maxm
#define eps
#define pp
#define inf 0x3f3f3f3f
#define re freopen("in.txt","r",stdin)
#define pi acos(-1.0)
int a[maxn];
int ans=0;
void deal(int n) {
if(n==1)ans+=a[1];
else if(n==2)ans+=a[2];//printf("%d\n",a[1]);
else if(n==3)ans+=a[3]+a[1]+a[2];//printf("%d\n",a[0]+a[1]+a[2]);
else {
if(2*a[2]>a[1]+a[n-1])
ans+=a[n-1]+2*a[1]+a[n];
else ans+=2*a[2]+a[1]+a[n];
deal(n-2);
}
}
int main() {
int n;
//re;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
sort(a+1,a+1+n);
ans=0;
deal(n);
printf("%d\n",ans);
return 0;
}
H题,不会。
I题。裸的最小二乘法。
#include <iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long
#define maxn 10005
#define maxm
#define eps
#define pp
#define inf 0x3f3f3f3f
#define re freopen("in.txt","r",stdin)
#define pi acos(-1.0)
double a[maxn];
int main(){
int n;
double xb=0,yb=0;
double sx,sy;
double tmp=0;
double dx=0;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lf",&a[i]);
yb+=a[i];
xb+=i;
dx+=i*i;
tmp+=a[i]*i;
}
sx=xb;
xb/=n;
yb/=n;
double b=(tmp-n*xb*yb)/(dx-n*xb*xb);
printf("%lf %lf\n",b+yb-b*xb,b);
return 0;
}
J题。不会。