浙大PAT考試1069~1072,浙大pat10691072
題目地址:http://pat.zju.edu.cn/contests/pat-a-practise
1069:
由下降序和上升序兩個四位元不斷相減,然後得到新資料,始終會到達一個數字終止。
遞迴可以寫,簡單。
AC代碼:
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int p[4];void dfs(int a,int b){ int del=a-b; printf("%04d - %04d = %04d\n",a,b,del); if(del==6174||del==0) return; int i=0; while(i<4) { p[i]=del%10; del/=10; i++; } sort(p,p+4); int m1=p[3]*1000+p[2]*100+p[1]*10+p[0]; int m2=p[0]*1000+p[1]*100+p[2]*10+p[3]; dfs(m1,m2);}int main(){ int n; while(cin>>n) { int i=0; while(i<4) { p[i]=n%10; n/=10; i++; } sort(p,p+4); int m1=p[3]*1000+p[2]*100+p[1]*10+p[0]; int m2=p[0]*1000+p[1]*100+p[2]*10+p[3]; dfs(m1,m2); } return 0;}
1070:
按照比值排序,遍曆即可。
AC代碼:
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const double eps=1e-12;struct node{ double num; double price;}nod[1005];int cmp(node p1,node p2){ if(p1.price/p1.num>=p2.price/p2.num) return 1; return 0;}int main(){ int n,i; double total; while(cin>>n>>total) { for(i=0;i<n;i++) cin>>nod[i].num; for(i=0;i<n;i++) cin>>nod[i].price; sort(nod,nod+n,cmp); double res=0; for(i=0;i<n;i++) { if(total>nod[i].num) { res+=nod[i].price; total-=nod[i].num; } else { res+=nod[i].price*(total/nod[i].num); break; } } printf("%.2f\n",res); } return 0;}/*3 200180 150 1007.5 7.2 4.5*/
1071:
就是讓你在一段文字中找出現最多次數的單詞,類比即可。
AC代碼:
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<map>#include<cstring>#include<string>#define maxn 1050000using namespace std;char str[maxn];char ans[maxn];char tmp[maxn];int ans1;map <string,int> mq;int judge(char p1){ if(p1>='0'&&p1<='9') return 1; if(p1>='a'&&p1<='z') return 1; if(p1>='A'&&p1<='Z') return 1; return 0;}int main(){ int len,i,p; while(gets(str)) { strcpy(ans,""); //³õʼ»¯ ans1=0; mq.clear(); len=strlen(str); p=0; for(i=0; i<len; i++) { if(judge(str[i])) { if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]+('a'-'A'); tmp[p++]=str[i]; } else if(!judge(str[i])&&p>0) { tmp[p]='\0'; mq[tmp]++; if(mq[tmp]>ans1||(mq[tmp]==ans1&&strcmp(tmp,ans)<=0)) { strcpy(ans,tmp); ans1=mq[tmp]; } p=0; } } if(p>0) { tmp[p]='\0'; mq[tmp]++; if(mq[tmp]>ans1||(mq[tmp]==ans1&&strcmp(tmp,ans)<=0)) { strcpy(ans,tmp); ans1=mq[tmp]; } } cout<<ans<<" "<<ans1<<endl; } return 0;}/*Can1: "Can a can can a can? It can!"*/
1072:
給你居民個數n,加油站個數m,k條路徑,加油站到居民距離不能超過的最大值d。然後接下來給了k條路徑。
題目讓我們求在所有的加油站中找符合不超過d的加油站。
如果加油站不唯一,按順序優先考慮下面三個條件:
1.居民最短距離最大的加油站。
2.到所有居民距離之和最小的。
3.編號最小的。
這個題目坑了很久,沒能AC,有兩個case過不了,只有22分。。。。。。
好累。。。
代碼:
#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<string>#include<algorithm>using namespace std;const int maxn = 1e9;int n,m,k,d;//居民個數,候選加油站,多少條路,距離限制int mp[1505][1505]; //存地圖int dis[1505]; //最短路int visi[1505];struct node{ int index; //編號 int sum; //總距離 int mi; //最短的距離};int calnumber(){ char tmp[105]; cin>>tmp; int ans=0,i; int len=strlen(tmp); if(tmp[0]=='G') { for(i=1;i<len;i++) ans=ans*10+(tmp[i]-'0'); return ans; } else { for(i=0;i<len;i++) ans=ans*10+(tmp[i]-'0'); return ans+m; }}void input() //輸入函數{ int i,j; for(i=0;i<1500;i++) { for(j=0;j<1500;j++) { if(i==j) mp[i][j]=0; else mp[i][j]=maxn; } } for(i=0;i<k;i++) { int p1=calnumber(); int p2=calnumber(); int weight; cin>>weight; mp[p1][p2]=mp[p2][p1]=weight; }}void dijkstra(int p){ int i,j; for(i=0;i<=1500;i++) { dis[i]=maxn; visi[i]=0; } dis[p]=0; //起始點 for(i=1;i<=n+m;i++) { int cur,mi=maxn; for(j=1;j<=n+m;j++) //從當前結點中找一個距離最小的,拿出來標記 { if(!visi[j]&&dis[j]<mi) { mi=dis[j]; cur=j; } } visi[cur]=1; for(j=1;j<=n+m;j++) { if(dis[j]>dis[cur]+mp[cur][j]) dis[j]=dis[cur]+mp[cur][j]; } }}int main(){ int i,j; int flag; while(cin>>n>>m>>k>>d) { flag=0; //flag=1表示已經有滿足要求的station了 input(); node ans; for(i=1;i<=m;i++) { dijkstra(i); int tot=0,mi=maxn,ma=0; for(j=m+1;j<=m+n;j++) //只計算house的距離 { if(mi>dis[j]) mi=dis[j]; if(ma<dis[j]) ma=dis[j]; tot+=dis[j]; } if(ma>k) continue; //超出服務涵蓋範圍 if(flag==0) { ans.index=i; ans.sum=tot; ans.mi=mi; flag=1; } else { int q=0; //q=1說明要更新 if(mi>ans.mi) //加油站越遠越好 q=1; else if(mi==ans.mi&&tot<ans.sum) q=1; else if(mi==ans.mi&&tot==ans.sum&&i<ans.index) q=1; if(q) { ans.index=i; ans.sum=tot; ans.mi=mi; } } //printf("G%d\n",ans.index); //printf("%.1f %.1f\n",(double)ans.sum/n,(double)ans.mi); //printf("%d\n",ans.ma); //printf("%d\n",ans.sum); } if(flag==0) { puts("No Solution"); continue; } printf("G%d\n",ans.index); printf("%.1f %.1f\n",(double)ans.mi,(double)ans.sum/n); } return 0;}/*4 3 11 51 2 21 4 21 G1 41 G2 32 3 22 G2 13 4 23 G3 24 G1 3G2 G1 1G3 G2 22 1 2 101 G1 92 G1 20*/
浙大的PAT考試只可以用C/C++?可不可以用JAVA
我曾經參加過,可以用Java提交,但是伺服器會將Java翻譯成C語言,但不保證正確性,你可以到題庫去試試,比如練習題中有一個出租車計價,Java寫第四個用例絕對通不過,C可以。
浙大PAT java提交格式?最近想練編程,做1001提交說返回非0,不知道怎更改,要什格式?
汗水在路旁
以為墨痕淺的一紙相思
天空映記著你的彷徨
但始終有一天可以的
的了·為為何還遲遲不的鎖
朝霞又一的參透的風的絮語。
你的的步一路在後