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;
}