社区讨论
不懂就问各位大佬
P1008[NOIP 1998 普及组] 三连击参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m5tsfwf1
- 此快照首次捕获于
- 2025/01/12 23:46 去年
- 此快照最后确认于
- 2025/11/04 11:41 4 个月前
我这代码跑出来的结果明明没错为什么会过不了(我之后把我这代码跑出来的结果直接cout上去了能过);这个写法是我改的第三种,因为之前两种也能出答案但也过不了,当时以为是写法问题就换成了这一种(结构体名称纯是因为改红温了ε(┬┬﹏┬┬)3)
这个代码的思路首先确定个位数,然后将其在数组a中排除掉(令其等于-1),然后由于第一个数为最小的数,所以他的百位数肯定小于等于3,通过循环来得到这个数,即P,然后用ooo来判断p是否能够满足要求(即判断p,2p, 3p的每一个数是否刚好为1到9)想法是我后期总结出来的,当时做的时候是想到哪写哪,所以写的比较繁杂,也有很多赘余的代码。
CPP#include<iostream>
#include<cmath>
#include<iomanip>
#include<stdio.h>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
struct wcnm{
int w;
int ww;
int www;
};
static vector<wcnm> qqq;
void refresh(int (&aaa)[9],int a[]){
for(int i=0;i<9;i++){
aaa[i]=a[i];
}
}
bool ooo(int q){
int qq=2*q;
int qqq=3*q;
int a[9];
for(int i=0;i<9;i++){
if(q!=0){
a[i]=q%10;
q/=10;
}
else if(q==0&&qq!=0){
a[i]=qq%10;
qq/=10;
}
else if(q==0&&qq==0&&qqq!=0){
a[i]=qqq%10;
qqq/=10;
}
else a[i]=0;
}
sort(a,a+9);
for(int i=0;i<9;i++){
if(a[i]==0) return false;
if(a[i]==a[i+1]&&i<8) return false;
}
return true;
}
bool compare(wcnm a,wcnm b){
return a.w<b.w;
}
void judge(int b[],int n){
int q=n;
int a[9];
refresh(a,b);
for(int i=0;i<9;i++){
if(a[i]==n) a[i]=-1;
if(a[i]==(2*n)%10){
a[i]=-1;
}
if(a[i]==(3*n)%10){
a[i]=-1;
}
}
int aa[9],p;
for(int i=0;i<3;i++){
refresh(aa,a);
if(aa[i]!=-1){
p=100*aa[i]+q;
int pp=p;
aa[i]=-1;
for(int j=0;j<9;j++){
if(aa[j]!=-1){
p=pp+10*aa[j];
if(ooo(p)==1) {
wcnm qqqq;
qqqq.w=p;
qqqq.ww=2*p;
qqqq.www=3*p;
qqq.push_back(qqqq);
}
}
}
}
}
}
int main(){
int a[9]={1,2,3,4,5,6,7,8,9};
for(int i1=0;i1<9;i1++){
judge(a,a[i1]);
}
sort(qqq.begin(),qqq.end(),compare);
for(int i=0;i<qqq.size();i++){
cout<<qqq[i].w<<" "<<qqq[i].ww<<" "<<qqq[i].www<<endl;
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...