日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

刷题记录(1)_HDU-1001→1010

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 刷题记录(1)_HDU-1001→1010 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1001 Sum Problem
  • 1002 A + B Problem II
  • 1003 Max Sum
  • 1004 Let the Balloon Rise
  • 1005 Number Sequence
  • 1006 Tick and Tick
  • 1007 Quoit Design
  • 1008 Elevator
  • 1009 FatMouse' Trade
  • 1010 Tempter of the Bone

1001 Sum Problem

vj_hdu1001

#include<iostream> using namespace std;int main(){int n,ans;while(cin>>n){ans=0;for(int i=1;i<=n;i++){ans+=i;}cout<<ans<<endl;cout<<'\n'; }return 0; }

1002 A + B Problem II

vj_hdu1002
大數用字符串進行加法運算

#include<iostream> #include<cstdio> #include<string> #include<string.h>using namespace std;int main(){int t;char a[1010],b[1010];int ans[1010];cin>>t;for(int i=1;i<=t;i++){memset(ans,0,sizeof(ans));scanf("%s %s",&a,&b);cout<<"Case "<<i<<":"<<endl;cout<<a<<" + "<<b<<" = ";int la,lb,lm;la=strlen(a);lb=strlen(b);lm=la>lb?la:lb;int ja,jb,lans,jans,mid;mid=0;for(ja=la-1,jb=lb-1,jans=0;ja>=0&&jb>=0;ja--,jb--,jans++){mid=((a[ja]-48)+(b[jb]-48)+mid);ans[jans]=mid%10;mid=mid/10; }if(jb>=0){for(;jb>=0;jb--,jans++){ans[jans]=((b[jb]-48)+mid)%10;mid=((b[jb]-48)+mid)/10;}}else if(ja>=0){for(;ja>=0;ja--,jans++){ans[jans]=((a[ja]-48)+mid)%10;mid=((a[ja]-48)+mid)/10;}}if(mid!=0){ans[jans]=mid;jans++;}for(int j=jans-1;j>=0;j--){cout<<ans[j];}cout<<endl;if(i!=t)cout<<endl;}return 0; }

1003 Max Sum

vj_hdu1003

求數列的最大的連續子序列和及其位置

假設已經得到最大和的自序列,那么之所以這個自序列不包含前面的幾個或者后面幾個元素的原因,就是因為前面(或者后面)連續幾個元素的和是負數

#include<iostream> #include<cstdio> #include<string> #include<string.h>using namespace std;int main(){int t,n,num[100001];cin>>t;for(int i=1;i<=t;i++){cin>>n;cout<<"Case "<<i<<":"<<endl;for(int j=0;j<n;j++){cin>>num[j];}int ma=num[0],st=0,ed=0,flag=0;for(int j=1;j<n;j++){if(num[j-1]>=0){num[j]=num[j]+num[j-1];}else flag=j;if(num[j]>ma){ma=num[j];ed=j;st=flag;}}cout<<ma<<" "<<st+1<<" "<<ed+1<<endl;if(i!=t)cout<<endl;} }

1004 Let the Balloon Rise

vj_hdu1004

結構體

#include<iostream> #include<cstdio> #include<string> #include<string.h>using namespace std;struct node{char co[20];int num; }color[1005]; int main(){int n;while(cin>>n){if(n==0) return 0;char a[16];int flag,maxx,add;for(int t=0;t<n;t++){cin>>a;flag=0;for(int i=0;i<t-1;i++){if(!strcmp(a,color[i].co)){flag=1;color[i].num++;break;}}if(flag==0){strcpy(color[t].co,a); color[t].num=1;}}maxx=0;for(int t=0;t<n;t++){if(color[t].num>maxx){maxx=color[t].num;add=t;} }cout<<color[add].co<<endl;} }

1005 Number Sequence

vj_hdu1005
找循環對,當前值只與前兩個數值有關,將數組中連續的兩個數視作一個數對,則出現重復數對時數組開始循環。
mod7?tmod7\Rightarrow tmod7?t 每個位置上的值只有7種(0~6)?\Rightarrow? 數對只有7*7=49種可能
?\Rightarrow? 數組前51個數中必出現重復數對

/*Name: hdu_1005Copyright: Author: Topology_lDate: 27/01/21 11:49Description: */#include<iostream> #include<cstdio>using namespace std;int main(){int a,b,n;while(scanf("%d%d%d", &a, &b, &n) && (a != 0 || b != 0 || n != 0)) {int f[55];f[1]=f[2]=1;for(int i=3;i<52;i++){f[i]=(a*f[i-1]+b*f[i-2])%7;}if(n<52){cout<<f[n]<<endl;continue;}int cst=1,cl=1;int flag=0;while(cst<50){cl=1;while(cst+cl<51){if(f[cst]==f[cst+cl]&&f[cst+1]==f[cst+cl+1]){flag=1;break;}cl++;}if(flag) break;cst++;}cout<<f[(n-cst)%cl+cst]<<endl; }return 0; }

1006 Tick and Tick

vj_hdu1006
。。。🙂我以前用的手表真的是一格一格跳的,絕望
這題要連續的搞,離散的精度不夠
連續的就得分段求解然后把滿足條件的區間長度相加
首先,指針的運動以12h為一周期,故只需計算12x60x60=43200s
這里以指針重合的時候作為劃分,秒針每轉一圈都會和分針時針分別相遇分針每轉一圈也會和時針相遇(即環形跑道上的追及問題),易得兩兩相遇的時間間隔是固定的 t=360v1?v2t=\frac{360}{v_1-v_2}t=v1??v2?360?,且在兩次相遇的時間點之間兩指針距離間隔大于D的時間區間為 [t+Dv1?v2,t?360?Dv1?v2][t+\frac{D}{v_1-v_2},t-\frac{360-D}{v_1-v_2}][t+v1??v2?D?,t?v1??v2?360?D?]。而題目要求的是三組區間(兩個指針滿足間隔條件的所有區間為一組,共三組)的重合部分的長度和占總時間的百分比。
代碼里呢用了三層循環來統計區間重疊長度,說起來如果先 秒分{時秒{時分}}這樣套會不會更省時點?三層for總給我種不夠優化的感覺…n^3呢…

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm>#define TIME 43200 using namespace std;int main(){double d;while(scanf("%lf",&d)&&d!=-1){double hm,hs,ms;hm=120.0/11;hs=120.0/(120*6-1);ms=10.0/(60-1); double thm,ths,tms,sthm,sths,stms,edhm,edhs,edms;thm = 360*hm; ths = 360*hs; tms = 360*ms; sthm = d*hm; sths = d*hs; stms = d*ms;edhm = (360-d)*hm; edhs = (360-d)*hs; edms = (360-d)*ms;double l,r,ans,i,j,k; ans=0;for(i=0;i<=TIME;i=i+thm){ for(j=0;j<=TIME;j=j+ths){ if(j+sths>i+edhm) break;if(j+edhs<i+sthm) continue;for(k=0;k<=TIME;k=k+tms){ if(k+stms>j+edhm) break;if(k+edms<j+sths) continue;l=max(max(i+sthm,j+sths),k+stms);r=min(min(i+edhm,j+edhs),k+edms);if(r>l)ans+=(r-l);}}}printf("%.3lf\n",ans*100/TIME);}return 0; }

1007 Quoit Design

任意兩點間的最小距離作為環的直徑
遍歷所有距離O(n2) TLE

《算法導論》33.4章 分治尋找最近點對 O(n log n)

  • 對集合P中所有點x坐標,y坐標分別遞增排序
  • 若 |P|<=3 ,對所有點對進行遍歷尋找最近距離;否則,進行下述分治
  • 直線x=a將點集P分成數量相等的兩個子集PL、PR,且令兩個數組中的點保持對x、y坐標值分別有序
  • 對PL,PR分別進行遞歸調用,求出PL內的最近距離 δL\delta_LδL? 和PR內的最近距離 δR\delta_RδR? ,令δ=min(δL,δR)\delta=min(\delta_L,\delta_R)δ=min(δL?,δR?),但這個最小距離沒有考慮一個點在PL一個點在PR的情況。
  • 若存在距離小于 δ\deltaδ 且一個點在PL一個點在PR的點對,則點對的兩個點一定都在以直線x=a為中心長 2δ2\delta2δδ\deltaδ 的一個矩形內,即在所有x軸坐標在 [a?δ,a+δ][a-\delta,a+\delta][a?δ,a+δ] 內的點中找距離小于 δ\deltaδ 的點對。將該區間內的點依y軸坐標遞增排序,若要找與點 p∈[a?δ,a+δ]p\in[a-\delta,a+\delta]p[a?δ,a+δ] 距離小于 δ\deltaδ 的點,只需要考慮緊隨其后的 7 個點1。對區間 [a?δ,a+δ][a-\delta,a+\delta][a?δ,a+δ] 內所有點,計算出其到其后7個點的距離,并記錄求得的最短距離 δ′\delta'δ
  • 返回min(δ,δ′)min(\delta,\delta')min(δ,δ)
  • 實現過程中若完全按照該算法分別保存兩個排序會出現內存不足的問題,鑒于只有 5 需要y軸排序,因此只在合并時對區間范圍內的點按y重新排序

    #include<iostream> #include<cstdio> #include<cmath> #include<algorithm>#define INF 0x3f3f3f3f using namespace std;typedef struct{double x;double y; }point; point px[100005];bool cmpx(point a,point b){if(a.x==b.x) return a.y<b.y;return a.x<b.x; } bool cmpy(point a,point b){return a.y<b.y; //遞增排序 }double point_distance(int left,int right){double dl,dr,dmin,l,h;if(right-left<3){dmin = INF;for(int i=left;i<=right;i++){for(int j=i+1;j<=right;j++){l = px[i].x-px[j].x;h = px[i].y-px[j].y;l = l*l+h*h;if(l<dmin) dmin=l;}}return dmin;}int len_seg = (right+left)/2;dl = point_distance(left,len_seg);dr = point_distance(len_seg+1,right);dmin = min(dl,dr); int ll=left,rr=right;double dm = dmin;double seg_x = px[len_seg].x; for(int i=len_seg;i>=left;i--) if(px[i].x < seg_x-dmin){ll = i+1;break;}for(int i=len_seg;i<=right;i++) if(px[i].x >seg_x-dmin){rr = i-1;break;}sort(px+ll,px+rr+1,cmpy);for(int i=ll;i<=rr;i++){for(int j=i+1;j<=i+7&&j<=rr;j++){if(px[j].y-px[i].y >= dmin) break;l = px[i].x-px[j].x;h = px[i].y-px[j].y;l = l*l+h*h;if(l<dm) dm = l; }}return dm; }int main(){int n;while(scanf("%d",&n)&&n!=0){for(int i=0;i<n;i++){scanf("%lf%lf",&px[i].x,&px[i].y);}sort(px,px+n,cmpx);double ans;ans = point_distance(0,n-1);printf("%.2lf\n",sqrt(ans)/2);}return 0; }

    1008 Elevator

    簡單到我以為我看錯題了

    #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define INF 0x3f3f3f3f using namespace std;int main(){int n;int now,next,ti;int up,down,stay;up = 6;down = 4;stay = 5;while(scanf("%d",&n)&&n!=0){now = 0;ti = n*stay;for(int i=0;i<n;i++){cin>>next;if(next > now){ti += (next-now)*up;now = next;} else if(next < now){ti += (now-next)*down;now = next;}}cout<<ti<<endl;}return 0; }

    1009 FatMouse’ Trade

    #include<iostream> #include<cstdio> #include<cmath> #include<algorithm>#define INF 0x3f3f3f3f using namespace std;typedef struct{int J; //javabeansint F; //cat fooddouble ratio; }food;bool cmp(food a,food b){return a.ratio>b.ratio; }int main(){int n,m;food f[1005];double cf,a;while(scanf("%d%d",&m,&n)&&n!=-1&&m!=-1){for(int i=0;i<n;i++){cin>>f[i].J>>f[i].F;f[i].ratio = 1.0*f[i].J/f[i].F;}sort(f,f+n,cmp);cf=0;for(int i=0;i<n;i++){if(m<=0) break;if(m >= f[i].F){cf += f[i].J;m -= f[i].F;}else{a = 1.0*m/f[i].F;cf += f[i].J*a;break;}}printf("%.3lf\n",cf);}return 0; }

    1010 Tempter of the Bone

    dfs,要的是滿足時間要求的某個可行解,而不是最優解
    剪枝:

  • 奇偶剪枝,可行解和最短距離奇偶性相同
  • 某路徑大于時間T就不用考慮了
  • wa得莫名其妙,放棄了
    大佬的ac代碼👈

    //我的垃圾代碼,如果有好心人看出wa點請指點一下我,感謝 //我都已經是照著ac代碼改了,依舊wa,瘋了 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring>using namespace std;char map[10][10]; int vis[10][10]; int ne[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int flag; int stx,sty,edx,edy; int N,M,T;void dfs(int x,int y,int len){int nextx,nexty;for(int i=0;i<4;i++){nextx = x+ne[i][0];nexty = y+ne[i][1];if(nextx==edx&&nexty==edy&&len+1==T){ flag = 1;return ;}if(len >= T) return ; //剪枝 if(nextx<1||nexty>N||nexty<1||nexty>M||map[nextx][nexty]=='X') continue;if(vis[nextx][nexty]==0&&map[nextx][nexty]=='.'){vis[nextx][nexty]=1;dfs(nextx,nexty,len+1);if(flag==1) return ;vis[nextx][nexty]=0; //}} }int main(){while(scanf("%d%d%d",&N,&M,&T)){if(N==0&&M==0&&T==0) break; memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map));flag=0;for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){cin>>map[i][j];if(map[i][j]=='S'){stx=i;sty=j;}if(map[i][j]=='D'){edx=i;edy=j;} } }int t=abs(edx-stx)+abs(edy-sty);if((T-t)%2==1){ //剪枝 cout<<"NO"<<endl;continue;}vis[stx][sty]=1;dfs(stx,sty,0); if(flag == 1) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0; }
  • 在矩形2δ×δ2\delta\times\delta2δ×δ中,對直線x=a左半邊正方形區域進行考慮,由于在PL中任意點對的距離大于等于δ\deltaδ,故該區域內至多只能有4個點。因此在矩形2δ×δ2\delta\times\delta2δ×δ內至多有P中的8個點 ??

  • 總結

    以上是生活随笔為你收集整理的刷题记录(1)_HDU-1001→1010的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。