模拟一24.10.1补题

24.10.1补题
1
  (1)暴力O(n^3)
  (2)优化固定i,找到不同直接+1  O(n^2)
  (3)DP
#include <bits/stdc++.h>
using namespace std;
    int main() {
    int t;
    cin >> t;
    for (int i = 0; i < t; i++) {
        int x;
        cin >> x;
        x--;
        bool ans = true;
        while (x) {
            ans ^= (x % 2);
            x /= 2;
        }
        cout << ans << endl;
    }
}
2
二分求解
#include<iostream>
using namespace std;
int n,t;
int solve(int L,int R,int p){
    if(L==R) return p;
    int mid=L+R>>1;
    if(n<=mid) return solve(L,mid,p);
    return solve(mid+1,R,p^1);
}
int main(){
    cin>>t;
    while(t--){
        scanf("%d",&n);
        printf("%d\n",solve(1,1<<30,1));
    }
    return 0;

3
因为只能顺时针拐弯一次,所以本题实质为求(1,1)为左上角顶点的加权矩形,使用对每个顶点的上下前缀和计算可以得到每个矩形大小再进行比较
#include<iostream>
using namespace std;
const int N=201;
int n,m,k,a[N][N];
int dx[]={0,1},dy[]={1,0};
pair<int,bool> f[N][N][N][2];
int dfs(int x,int y,int step,int d){
    if(x>n||y>m||step>k) return -0x3f3f3f3f;
    if(x==n&&y==m) return a[x][y];
    if(f[x][y][step][d].second) return f[x][y][step][d].first;
    f[x][y][step][d].second=1;
    int ans=-0x3f3f3f3f;
    if(step<k) ans=max(ans,dfs(x+dx[d],y+dy[d],step+1,d));
    ans=max(ans,dfs(x+dx[d^1],y+dy[d^1],2,d^1));
    if(ans<-1e9) return f[x][y][step][d].first=-0x3f3f3f3f;
    return f[x][y][step][d].first=ans+a[x][y];
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int tmp=max(dfs(1,2,2,0),dfs(2,1,2,1));
    if(tmp>-1e9) printf("%d",tmp+a[1][1]);
    else printf("No Answer!");
}


4
利用r^2>n^2+m^2的情况+样例特判

本题使用四个圆弧经过四分矩形的不同情况的判断,对四部分的四种不同情况进行分类与计算   进行对三角函数和反三角函数的使用(cmath)将情况分类为直角三角形和扇形进行计算
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1),eps=1e-8;//得到精确pai和极小值用来判断误差是否很小 
double n,m,a,b,r;
double cal(double n,double m,double r){
    if(n<m) swap(n,m);//保证n为长 m为宽 
    if(n<=eps||m<=eps) return 0;//有极小误差判断为相等 
    if(r<=m) return 0.25*pi*r*r;//r很小时,直接计算1/4圆 
    if(r>=sqrt(n*n+m*m)) return n*m;//r大于对角线,重合面积为矩形 
    if(r<=n) return sqrt(r*r-m*m)*m*0.5+0.5*r*r*(0.5*pi-acos(m/r));//>m,<n时,重合面积为一个直角三角形+扇形 
    return sqrt(r*r-m*m)*m*0.5+sqrt(r*r-n*n)*n*0.5+0.5*r*r*(0.5*pi-acos(m/r));//>n,>m,<对角线,重合为扇形+两个直角三角形 
}
int main(){
    cin>>n>>m>>a>>b>>r;
    printf("%lf",cal(a,b,r)+cal(n-a,b,r)+cal(a,m-b,r)+cal(n-a,m-b,r));//输出四部分面积 
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值