资讯动态

小白做题日记(3)洛谷P5440 洛谷P1378

发布时间:2026/10/14 8:55:29 来源:尧图企业网站定制
1.https://www.luogu.com.cn/problem/P5440 (预处理枚举字符串匹配日期相关出现这种日期问题需要考虑的问题1.每个月的日期是多少天。2.一共12个月。3.平年闰年的处理二月份平年是28天闰年时29天。不能直接枚举可以利用题目给的提示排除一定不可能成为答案的数日3,7,11,13,17,19,23,29,31 2,5结尾的数一定可以被2和5整除可以排除月日质数年月日质数所以我们可以先对所有数据进行预处理再将可能是答案的数字与S进行匹配其他更多逻辑在代码中标识了说明一下在做题的时候遇到了一个问题在预处理后的数中年份不一定是4位数所以要进行补0要在前面补所以应该是while(data.size() 8) data 0 data;data 0是补在后面的这样不正确。代码#includeiostream #includecstring using namespace std; const int Max 1e7; int T,res; int ans[Max]; int flag; //判断是否是质数 bool isPrime(int n){ if(n 2) return false; if(n 2) return true; if(n % 2 0) return false; for(int i 3;i * i n;i2){ if(n % i 0) return false; } return true; } //判断是否是闰年 bool isLeap(int y){ if(y % 400 0 || (y % 4 0 y % 100 ! 0)) return true; return false; } //判断这个日期是否真实存在而且符合题意 bool isExist(int y,int m,int d){ if(y 1 || y 9999) return false; if(m 1 || m 12) return false; int days[] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeap(y)) days[2] 29; return d 1 d days[m]; } //预处理所有数据便于后续字符串的匹配 void init(){ for(int y 1;y 9999;y){ for(int m 1;m 12;m){ for(int d 3;d 31;d){ //存在 if(!isExist(y,m,d)) continue; //day必须是质数 if(!isPrime(d)) continue; //保证日月为质数 int md m*100d; if(!isPrime(md)) continue; //保证年日月为质数 int ymd y * 10000 md; if(!isPrime(ymd)) continue; ans[flag] ymd; } } } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); init(); cin T; while(T--){ res 0; string s; cin s; for(int i 1;i flag;i){ //将int类型的ans转化为string 类型为后续字符串匹配做准备 string data to_string(ans[i]); //补0 while(data.size() 8) data 0data; bool isOK true; //字符串匹配 for(int j 0;j s.size();j){ //如果输入位置不是‘-’并且数字不相等,那么这个数字一定不是答案直接跳过 if(s[j] ! data[j] s[j] ! - ) { isOK false; break; } } if(isOK) res; } cout res endl; } return 0; }总结就是不难想但是要考虑的方方面面的东西挺多的需要考虑的全面一点。AC记录https://www.luogu.com.cn/record/3028250322.https://www.luogu.com.cn/problem/P1378 (dfs回溯)这个题你一看哎N6,那6个点全排列6*5*4*3*2*1 720 感觉不是很多啊那就可以用dfs来枚举所有情况通过读题你能发现咱们所选择的点的半径r得取min(圆心到四个边的最小值到已有圆的圆心Oi - ri的最小值#includeiostream #includealgorithm #includecmath using namespace std; int n; double X[6],Y[6],R[6]; bool used[6]; int x,y,xx,yy,xmin,xmax,ymin,ymax; double res; const double PI acos(-1.0); //算两点距离 double dis(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2) (y1-y2)*(y1-y2)); } void dfs(int k,double sum){//k是当前选择了几个sum是当前选择的所有圆的总面积 //完成一种组合 if(k n){ res max(res,sum); return; } for(int i 0;i n;i){ if(used[i]) continue; double r min({X[i] - xmin ,Y[i]-ymin,xmax - X[i],ymax - Y[i]}); //考虑已经选了的那些点 for(int j 0;j n;j){ if(!used[j]) continue; double dist dis(X[i], Y[i], X[j], Y[j]); r min(r,dist - R[j]); } //大于0 r max(0.0,r); R[i] r; used[i] true; dfs(k1,sum PI * r *r); //回溯 used[i] false; R[i] 0.0; } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin n x y xx yy ; //统一边界方向避免输入的两个顶点顺序影响计算 xmin min(x, xx); xmax max(x, xx); ymin min(y, yy); ymax max(y, yy); for(int i 0;i n;i){ cin X[i] Y[i]; } dfs(0,0.0); double ans (xmax-xmin)*(ymax-ymin) - res; cout (long long)round(ans) endl; return 0; }AC记录https://www.luogu.com.cn/record/302842760

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑