打卡题真水2
2024-08-28 20:31:49 By 陈明玮
论今日打卡题数据之水
2024-08-28 20:17:45 By 陈明玮
12754 Mathler 题解
2024-06-01 13:16:57 By 陈明玮
直接上代码!!!
#include <iostream>
using namespace std;
string ans[100005];
char lock[6];
long long cnt;
string from_int_to_string(long long x) {
string a="";
if(x==0) {
return "0";
}
while(x) {
a=(char)('0'+(x%10))+a;
x/=10;
}
return a;
}
int main() {
ios::sync_with_stdio(false);
long long n;
cin>>n;
for(long long i=100000; i<=999999; i++) {
if(i==n) {
cnt++;
ans[cnt]=from_int_to_string(n);
}
}
for(long long i=0; i<10000; i++) {
long long maxj=0;
string is=from_int_to_string(i);
if(is.size()==4) maxj=9;
if(is.size()==3) maxj=99;
if(is.size()==2) maxj=999;
if(is.size()==1) maxj=9999;
for(long long j=0; j<maxj; j++) {
string js=from_int_to_string(j);
if(is.size()+js.size()!=5) {
continue;
}
if(i+j==n) {
cnt++;
ans[cnt]=is+"+"+js;
}
if(i-j==n) {
cnt++;
ans[cnt]=is+"-"+js;
}
if(i*j==n) {
cnt++;
ans[cnt]=is+"*"+js;
}
if(j!=0) {
if(i%j==0) {
if(i/j==n) {
cnt++;
ans[cnt]=is+"/"+js;
}
}
}
}
}
for(long long i=0; i<100; i++) {
string is=from_int_to_string(i);
long long maxj;
if(is.size()==2) maxj=10;
else maxj=100;
for(long long j=0; j<maxj; j++) {
string js=from_int_to_string(j);
long long maxk;
if(is.size()==2||js.size()==2) maxk=10;
else maxk=100;
for(long long k=0; k<100; k++) {
string ks=from_int_to_string(k);
if(is.size()+js.size()+ks.size()!=4) continue;
if(i+j+k==n) {
cnt++;
ans[cnt]=is+"+"+js+"+"+ks;
}
if(i+j-k==n) {
cnt++;
ans[cnt]=is+"+"+js+"-"+ks;
}
if(i+j*k==n) {
cnt++;
ans[cnt]=is+"+"+js+"*"+ks;
}
if(k!=0) if(j%k==0)
if(i+j/k==n) {
cnt++;
ans[cnt]=is+"+"+js+"/"+ks;
}
if(i-j+k==n) {
cnt++;
ans[cnt]=is+"-"+js+"+"+ks;
}
if(i-j-k==n) {
cnt++;
ans[cnt]=is+"-"+js+"-"+ks;
}
if(i-j*k==n) {
cnt++;
ans[cnt]=is+"-"+js+"*"+ks;
}
if(k!=0) if(j%k==0)
if(i-j/k==n) {
cnt++;
ans[cnt]=is+"-"+js+"/"+ks;
}
if(i*j+k==n) {
cnt++;
ans[cnt]=is+"*"+js+"+"+ks;
}
if(i*j-k==n) {
cnt++;
ans[cnt]=is+"*"+js+"-"+ks;
}
if(i*j*k==n) {
cnt++;
ans[cnt]=is+"*"+js+"*"+ks;
}
if(k!=0) if((i*j)%k==0)
if(i*j/k==n) {
cnt++;
ans[cnt]=is+"*"+js+"/"+ks;
}
if(j!=0) {
if(i%j==0)
if(i/j+k==n) {
cnt++;
ans[cnt]=is+"/"+js+"+"+ks;
}
if(i%j==0)
if(i/j-k==n) {
cnt++;
ans[cnt]=is+"/"+js+"-"+ks;
}
if((i*k)%j==0)
if(i*k/j==n) {
cnt++;
ans[cnt]=is+"/"+js+"*"+ks;
}
if(k!=0)
if(i%(j*k)==0)
if(i/j/k==n) {
cnt++;
ans[cnt]=is+"/"+js+"/"+ks;
}
}
}
}
}
bool used[128];
bool mst[128];
for(long long i=0; i<127; i++) used[i]=mst[i]=0;
for(long long i=1; i<=cnt; i++) {
long long ok=1;
bool tmp[128];
for(long long j='0'; j<='9'; j++) tmp[j]=0;
tmp['+']=tmp['-']=tmp['*']=tmp['/'];
for(long long j=0; j<ans[i].size(); j++) {
if(used[ans[i][j]]) {
ok=0;
}
if(lock[j]) {
if(ans[i][j]!=lock[j]) {
ok=0;
}
}
tmp[ans[i][j]]=1;
}
for(long long j='0'; j<='9'; j++) if(mst[j]&&(!tmp[j])) ok=0;
if(mst['+']&&(!tmp['+'])) ok=0;
if(mst['-']&&(!tmp['-'])) ok=0;
if(mst['*']&&(!tmp['*'])) ok=0;
if(mst['/']&&(!tmp['/'])) ok=0;
if(ok) {
cout<<ans[i]<<endl;
string t;
cin>>t;
for(long long j=0; j<ans[i].size(); j++) {
if(t[j]=='X') {
used[ans[i][j]]=1;
}
}
for(long long j=0; j<ans[i].size(); j++) {
if(t[j]=='A'||t[j]=='B') {
used[ans[i][j]]=0;
mst[ans[i][j]]=1;
}
if(t[j]=='A') {
lock[j]=ans[i][j];
}
}
if(t=="AAAAAA") {
return 0;
}
}
}
return 0;
}
别数了,200行
今天上课时突发奇想,花了我一个小时才写出来
省赛冲刺班模拟考试 题解
2024-05-31 21:48:39 By 陈明玮
A.取石子
将数据特判一下,递归求解。
#include<iostream>
using namespace std;
int a,b;
bool f;
void s() {
f=!f;
if(a==b||a/b>=2||b/a>=2) {
return;
}
a>b?a-=b:b-=a;
s();
}
int main() {
while(cin>>a>>b) {
if(a==0&&b==0) {
break;
}
if(a==0||b==0) {
cout<<"win"<<endl;
continue;
}
f=false;
s();
if(f) {
cout<<"win"<<endl;
} else {
cout<<"lose"<<endl;
}
}
return 0;
}
B.骑行
套用数学公式,并且出发时间为负数的不管他,反正追不上。找最快的。
#include <iostream>
using namespace std;
int n,ans,v,t;
int main() {
while(cin>>n) {
if(n==0) {
break;
}
ans=0xfffffff;
for(int i=1 ; i<=n; i++) {
cin>>v>>t;
if(t<0) {
continue;
}
int f=(16200.0/(double)v)+t+0.99;
ans=min(f,ans);
}
cout<<ans<<endl;
}
return 0;
}
C.拯救行动
经典的宽搜,加一个杀掉守卫的if就行了。
#include <iostream>
#include <cstring>
using namespace std;
int n,m,ax,ay,bx,by,f,minn,v[210][210],q[40100][3],dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1},t;
char map[210][210];
void bfs(int x,int y,int l) {
int head=0,tail=1;
q[tail][0]=x;
q[tail][1]=y;
q[tail][2]=l;
v[x][y]=1;
while(head!=tail) {
head++;
x=q[head][0];
y=q[head][1];
l=q[head][2];
v[x][y]=1;
if(x==bx&&y==by) {
minn=l;
break;
}
if(map[x][y]=='x') {
tail++;
map[x][y]='@';
q[tail][0]=x;
q[tail][1]=y;
q[tail][2]=l+1;
} else {
for(int i=0; i<4; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&map[nx][ny]!='#'&&v[nx][ny]==0) {
tail++;
q[tail][0]=nx;
q[tail][1]=ny;
q[tail][2]=l+1;
v[nx][ny]=1;
}
}
}
}
}
int main() {
cin>>t;
while(t--) {
minn=0;
memset(map,'#',sizeof(map));
memset(v,0,sizeof(v));
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>map[i][j];
if(map[i][j]=='r') {
ax=i;
ay=j;
}
if(map[i][j]=='a') {
bx=i;
by=j;
}
}
}
bfs(ax,ay,0);
if(minn) {
cout<<minn<<endl;
} else {
cout<<"Impossible"<<endl;
}
}
return 0;
}
D.阶梯电价
直接枚举u、v之间的数,几个if判断就行了。
#include <iostream>
using namespace std;
int u,v;
double ans;
int main() {
cin>>u>>v;
for(int i=u+1; i<=v; i++) {
if(i<=2760) {
ans+=0.52;
} else if(i>2760&&i<=4800) {
ans+=0.57;
} else if(i>4800) {
ans+=0.82;
}
}
printf("%.2f",ans);
return 0;
}