- C++
章节8 总结
- @ 2025-4-15 19:24:18
占卜DIY
思路:模拟题,注意用双端队列二维数组。
代码:
#include<bits/stdc++.h>
using namespace std;
struct P{
bool vis;
int num;
};
deque<P> a[20];
int vis[100];
int main(){
P st;
for (int i=1;i<=13;i++){
for (int j=1;j<=4;j++){
char l;
cin >> l;
if(l=='A'){
st.num=1;
st.vis=0;
a[i].push_front(st);
}else if(l=='J'){
st.num=11;
st.vis=0;
a[i].push_front(st);
}else if(l=='Q'){
st.num=12;
st.vis=0;
a[i].push_front(st);
}else if(l=='K'){
st.num=13;
st.vis=0;
a[i].push_front(st);
}else if(l=='0'){
st.num=10;
st.vis=0;
a[i].push_front(st);
}else{
st.num=l-'0';
st.vis=0;
a[i].push_front(st);
}
}
}
P top;
P top2;
for (int t=0;t<4;t++){
top=a[13].back();
a[13].pop_back();
top.vis=1;
if(top.num==13) continue;
while(top.num!=13){
a[top.num].push_back(top);
top2=top;
top=a[top.num].front();
a[top2.num].pop_front();
top.vis=1;
}
}
for (int i=1;i<=13;i++){
for (int j=0;j<a[i].size();j++){
if(a[i][j].vis) vis[a[i][j].num]++;
}
}
int ans=0;
for(int i=1;i<=12;i++){
if(vis[i]==4) ans++;
}
cout << ans << endl;
}
袭击
思路:一题平面最近点对的变形题,注意用vis数组标注好阵营,最后判断时,如果vis值一样,则将距离设为无穷大,其余遵循平面最经典对的求法。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+50;
struct PII{
double x,y;
bool vis;
bool operator<(const PII &T) const{
return x<T.x;
}
};
PII a[N],tmp[N];
double dist(PII a,PII b){
//依赖于归并的平面最近点对
if(a.vis==b.vis) return 2e9;
double _x=a.x-b.x,_y=a.y-b.y;
return sqrt(_x*_x+_y*_y);
}
double dfs(int l,int r){
if(l>=r) return 2e9;
int mid=l+r>>1;
double ans=min(dfs(l,mid),dfs(mid+1,r));
{
// 不要问为什么加括号,问就是防止命名重复
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i].y>a[j].y){
tmp[k++]=a[i++];
}else{
tmp[k++]=a[j++];
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(int i=0,j=l;i<k;i++,j++){
a[j]=tmp[i];
}
}
int k=0;
for(int i=l;i<=r;i++){
if(a[i].x<=a[mid].x+ans&&a[i].x>=a[mid].x-ans) tmp[k++]=a[i];
}
for(int i=0;i<k;i++){
for(int j=i-1;j>=0&&tmp[i].y-tmp[j].y<ans;j--){
ans=min(ans,dist(tmp[i],tmp[j]));
}
}
return ans;
}
signed main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i].x >> a[i].y;
a[i].vis=0;
}
for(int i=n;i<2*n;i++){
cin >> a[i].x >> a[i].y;
a[i].vis=1;
}
sort(a,a+2*n);
printf("%.3lf\n",dfs(0,2*n-1));
}
}
数的进制转换
思路:f进制高精度除法模版题
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t;
cin >> t;
while(t--){
int x,y;
string a,b;
cin >> x >> y >> a;
vector<int> x2,y2;
for(int i=0;i<a.size();i++){
if(a[i]>='0'&&a[i]<='9') x2.push_back(a[i]-'0');
else if(a[i]>='A'&&a[i]<='Z') x2.push_back(a[i]-'A'+10);
else x2.push_back(a[i]-'a'+36);
}
reverse(x2.begin(),x2.end());
while(x2.size()){
int r=0;
// 高精除,但是非十进制
for(int i=x2.size()-1;i>=0;i--){
x2[i]+=r*x;
r=x2[i]%y;
x2[i]/=y;
}
y2.push_back(r);
while(x2.back()==0&&x2.size()>0) x2.pop_back();
}
reverse(y2.begin(),y2.end());
for(int i=0;i<y2.size();i++){
if(y2[i]<=9) b+=char(y2[i]+'0');
else if(y2[i]>=10&&y2[i]<=35) b+=char(y2[i]+'A'-10);
else b+=char(y2[i]+'a'-36);
}
cout << x << " " << a << endl << y << " " << b << endl << endl;
}
}
0 条评论
目前还没有评论...