USACO2.4の其中3道水题【模拟,图论】
生活随笔
收集整理的這篇文章主要介紹了
USACO2.4の其中3道水题【模拟,图论】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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個大寫字母用邊連接形成帶權(quán)無向圖
求離Z最近的大寫字母。
解題思路
從Z出發(fā),然后計算每個大寫字母的距離最小的。
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 分數(shù)化小數(shù) Fractions to Decimals
題目大意
將一個分數(shù)表示成小數(shù)形式。
解題思路
因為懶得寫所以用了一道更難的題的方法。
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); }總結(jié)
以上是生活随笔為你收集整理的USACO2.4の其中3道水题【模拟,图论】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么手机相册打不开是怎么回事 怎样能够
- 下一篇: USACO2.4のP1519-穿越栅栏(