A题:
签到题:
#include<stdio.h>
const double eps=1e-8;
int main(){
//freopen("in.txt","r",stdin);
int T;
double m,h;
scanf("%d",&T);
while(T--){
scanf("%lf%lf",&m,&h);
double ans=m/(h*h);
if(ans<18.5-eps){
printf("Underweight\n");
}
else if(ans<23.0-eps){
printf("Normal\n");
}
else{
printf("Overweight\n");
}
}
}
B题:
把两点间距离表示出来,发现是个开口向上的曲线,直接取t=(-b)/(2a),注意定义域t>=0,还有注意a==0的情况
#include<stdio.h>
#include<math.h>
#define sqr(x) ((x)*(x))
const double eps=1e-8;
double dist(double x1,double y1,double x2,double y2){
return sqrt(sqr(x1-x2)+sqr(y1-y2));
}
int main(){
//freopen("in.txt","r",stdin);
int T;
double x1,x2,y1,y2,vx1,vx2,vy1,vy2;
scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf%lf",&x1,&y1,&vx1,&vy1);
scanf("%lf%lf%lf%lf",&x2,&y2,&vx2,&vy2);
double a=sqr(vx1-vx2)+sqr(vy1-vy2);
double b=2.0*((x1-x2)*(vx1-vx2)+(y1-y2)*(vy1-vy2));
double t=(-b)/(2.0*a);
if(t<-eps||fabs(a)<eps) {
t=0.0;
}
printf("%.8f\n",dist(x1+vx1*t,y1+vy1*t,x2+vx2*t,y2+vy2*t));
}
}
C题:
贪心,从第一棵树开始选起,后面的只要距离小于规定值都砍掉
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
int a[100005];
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,d;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int post=1;
int ans=1;
for(int i=2;i<=n;i++) {
if(a[i]-a[post]>=d){
ans++;
post=i;
}
}
printf("%d\n",ans);
}
}
D题:
扫描线,把所有端点用一个结构体表示,区间的入点记为1,出点记为-1,当区间被覆盖次数变为0时,统计当前点到入点的数的数量
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
struct Node{
int x,flag;
}a[400005];
int cmp(Node a,Node b){
if(a.x==b.x) return a.flag>b.flag;
return a.x<b.x;
}
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,m;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[2*i].x,&a[2*i+1].x);
a[2*i].flag=1; a[2*i+1].flag=-1;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&a[2*n+2*i].x,&a[2*n+2*i+1].x);
a[2*n+2*i].flag=1; a[2*n+2*i+1].flag=-1;
}
int l=2*n+2*m;
sort(a,a+l,cmp);
int cover=0,post=0,ans=0;
for(int i=0;i<l;i++){
//printf("%d %d\n",a[i].flag,a[i].x);
cover+=a[i].flag;
if(cover==0) {
ans+=a[i].x-a[post].x+1;
}
if(cover==1&&a[i].flag==1){
post=i;
}
}
printf("%d\n",ans);
}
}
E题:
当2*A>B时,只能直接加1加至B
当2*A<=B时,问题就转化为了怎么用最小的步数从A到达B/2
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
typedef long long ll;
const double eps=1e-8;
ll ans;
void solve(ll x,ll y){
if(x*2>y){
ans+=y-x;
return;
}
else{
if(y%2==0){
ans++;
solve(x,y/2);
}
else{
ans+=2;
solve(x,y/2);
}
}
}
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,m;
scanf("%d",&T);
ll x,y;
while(T--){
scanf("%lld%lld",&x,&y);
ans=0;
solve(x,y);
printf("%lld\n",ans);
}
}
F题:
从后看起,当a[i]>a[i+1]时,a[i]以及前面的数都必须进行一次插入,而每次插入的时候,只需要插至对应位置就可以了
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
typedef long long ll;
const double eps=1e-8;
int a[100005];
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,m;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int ans=1;
for(int i=n-1;i>=1;i--) {
if(a[i]<a[i+1]) ans++;
else break;
}
printf("%d\n",n-ans);
}
}
G题:
用long long就可以了
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define mod 1000000007
typedef long long ll;
const double eps=1e-8;
ll a[1000005];
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,m;
a[0]=0;a[1]=1;
for(int i=2;i<=1000000;i++){
a[i]=(a[i-2]%mod+a[i-1]%mod)%mod;
}
scanf("%d",&T);
int x,y;
while(T--){
scanf("%d%d",&x,&y);
ll ans;
ans=(a[x]%mod*a[y]%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}
H题:
三条直线距离求出来,用海伦公式
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define sqr(x) ((x)*(x))
const double eps=1e-8;
struct Point{
double x,y,z;
};
double dist(Point a,Point b){
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z));
}
int main(){
//freopen("in.txt","r",stdin);
int T;
int n,m;
scanf("%d",&T);
int x,y;
while(T--){
Point p1,p2,p3;
scanf("%lf%lf%lf",&p1.x,&p1.y,&p1.z);
scanf("%lf%lf%lf",&p2.x,&p2.y,&p2.z);
scanf("%lf%lf%lf",&p3.x,&p3.y,&p3.z);
double a=dist(p1,p2);
double b=dist(p1,p3);
double c=dist(p3,p2);
double p=(a+b+c)/2;
printf("%lf\n",sqrt(p*(p-a)*(p-b)*(p-c)));
}
return 0;
}