全场有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题。不会。