T1:P1518-两只塔姆沃斯牛 The Tamworth Two
题目大意
两个东西,按照一个方向前进,他们撞到墙壁会顺时针90°,求他们多久后相遇。
解题思路
暴力模拟
code
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
using namespace std;
const int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
struct node{int x,y,f;
}f,c;
char a[11][11];
int main()
{for(int i=1;i<=10;i++)for(int j=1;j<=10;j++){cin>>a[i][j];if(a[i][j]=='F') f=(node){i,j,0};if(a[i][j]=='C') c=(node){i,j,0};}for(int i=1;i<=100000;i++){if(a[f.x+dx[f.f]][f.y+dy[f.f]]=='*'||f.x==10&&f.f==2||f.y==10&&f.f==1||f.x==1&&f.f==0||f.y==1&&f.f==3)f.f=(f.f+1)%4;else f.x+=dx[f.f],f.y+=dy[f.f];if(a[c.x+dx[c.f]][c.y+dy[c.f]]=='*'||c.x==10&&c.f==2||c.y==10&&c.f==1||c.x==1&&c.f==0||c.y==1&&c.f==3)c.f=(c.f+1)%4;else c.x+=dx[c.f],c.y+=dy[c.f];if(f.x==c.x&&f.y==c.y){printf("%d",i);return 0;}}printf("0");
}
T2:P1529-回家 Bessie Come Home
题目大意
26个小写字母和26个大写字母用边连接形成带权无向图
求离Z最近的大写字母。
解题思路
从Z出发,然后计算每个大写字母的距离最小的。
code
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
struct line{int from,to,w,next;
}a[200010];
int tot,ls[100],f[100],p,s,w,ans;
char x,y;
bool v[100];
queue<int> q;
void addl(int x,int y,int w)
{a[++tot]=(line){x,y,w,ls[x]};ls[x]=tot;}
void spfa()
{q.push(s);v[s]=true;memset(f,127/3,sizeof(f));f[s]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y]){v[y]=true;q.push(y);}}}v[x]=false;}
}
int main()
{scanf("%d",&p);for(int i=1;i<=p;i++){cin>>x>>y>>w;if(x<='Z') x-='A'-1;else x-='a'-27;if(y<='Z') y-='A'-1;else y-='a'-27;addl(x,y,w);addl(y,x,w);}s=26;spfa();f[ans]=2147483647;for(int i=1;i<=25;i++)if(f[i]<f[ans]) ans=i;printf("%c %d",ans+'A'-1,f[ans]);
}
T3-P1530 分数化小数 Fractions to Decimals
题目大意
将一个分数表示成小数形式。
解题思路
因为懒得写所以用了一道更难的题的方法。
code
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
using namespace std;
int t;
int a,b,k,d,ans1,s;
int gcd(int a,int b)
{if (a%b==0) return b;return gcd(b,a%b);
}
int ksm(int x,int k)
{int ans=0;while(k){if (k&1) ans=(ans+x)%b;x=(x*2)%b;k>>=1;}return ans;
}
int qsm(int x,int k)
{int ans=1;while(k){if (k&1) ans=ksm(ans,x);x=ksm(x,x);k>>=1;}return ans;
}
int phi(int x)
{int ans=x;for (int i=2;i*i<=x;i++)if (x%i==0) {ans=ans/i*(i-1);while (x%i==0) x/=i;}if (x>1) ans=ans/x*(x-1);return ans;
}
void print(int a,int b,int hlen,int rlen)
{s++;a=a%b*10;if(hlen+rlen==0)hlen=1;for(int i=1;i<=hlen;i++){printf("%d",a/b);s++;if(s==76) printf("\n"),s=0;a=a%b*10;}if(rlen){printf("(");s++;if(s==76) printf("\n"),s=0;for(int i=1;i<=rlen;i++){printf("%d",a/b);s++;if(s==76) printf("\n"),s=0;a=a%b*10;}printf(")");s++;if(s==76) printf("\n"),s=0;}
}
int main()
{//freopen("out.txt","w",stdout);scanf("%d%d",&a,&b);printf("%d.",a/b);int k=a/b;if(!k) s=1;while(k){s++;if(s==76) printf("\n"),s=0;k/=10;}int ba=a,bb=b;k=10;ans1=0;int d=gcd(a,b);a/=d;b/=d;d=gcd(b,k);while ((d=gcd(b,k))>1) b/=d,ans1++;if (b==1) {print(ba,bb,ans1,0);return 0;}int x,y;x=y=phi(b);for (int i=2;i*i<=x;i++)if (!(y%i)){while (!(x%i)&&qsm(k,x/i)==1) x/=i;do y/=i; while(!(y%i));}if (y>1&&qsm(k,x/y)==1) x/=y;print(ba,bb,ans1,x);
}