刷题记录(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
大數用字符串進行加法運算
1003 Max Sum
vj_hdu1003
求數列的最大的連續(xù)子序列和及其位置
假設已經得到最大和的自序列,那么之所以這個自序列不包含前面的幾個或者后面幾個元素的原因,就是因為前面(或者后面)連續(xù)幾個元素的和是負數
#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
找循環(huán)對,當前值只與前兩個數值有關,將數組中連續(xù)的兩個數視作一個數對,則出現重復數對時數組開始循環(huán)。
又mod7?tmod7\Rightarrow tmod7?t 每個位置上的值只有7種(0~6)?\Rightarrow? 數對只有7*7=49種可能
?\Rightarrow? 數組前51個數中必出現重復數對
1006 Tick and Tick
vj_hdu1006
。。。🙂我以前用的手表真的是一格一格跳的,絕望
這題要連續(xù)的搞,離散的精度不夠
連續(xù)的就得分段求解然后把滿足條件的區(qū)間長度相加
首先,指針的運動以12h為一周期,故只需計算12x60x60=43200s
這里以指針重合的時候作為劃分,秒針每轉一圈都會和分針時針分別相遇分針每轉一圈也會和時針相遇(即環(huán)形跑道上的追及問題),易得兩兩相遇的時間間隔是固定的 t=360v1?v2t=\frac{360}{v_1-v_2}t=v1??v2?360?,且在兩次相遇的時間點之間兩指針距離間隔大于D的時間區(qū)間為 [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?]。而題目要求的是三組區(qū)間(兩個指針滿足間隔條件的所有區(qū)間為一組,共三組)的重合部分的長度和占總時間的百分比。
代碼里呢用了三層循環(huán)來統(tǒng)計區(qū)間重疊長度,說起來如果先 秒分{時秒{時分}}這樣套會不會更省時點?三層for總給我種不夠優(yōu)化的感覺…n^3呢…
1007 Quoit Design
任意兩點間的最小距離作為環(huán)的直徑
遍歷所有距離O(n2) TLE
《算法導論》33.4章 分治尋找最近點對 O(n log n)
實現過程中若完全按照該算法分別保存兩個排序會出現內存不足的問題,鑒于只有 5 需要y軸排序,因此只在合并時對區(qū)間范圍內的點按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,要的是滿足時間要求的某個可行解,而不是最優(yōu)解
剪枝:
wa得莫名其妙,放棄了
大佬的ac代碼👈
在矩形2δ×δ2\delta\times\delta2δ×δ中,對直線x=a左半邊正方形區(qū)域進行考慮,由于在PL中任意點對的距離大于等于δ\deltaδ,故該區(qū)域內至多只能有4個點。因此在矩形2δ×δ2\delta\times\delta2δ×δ內至多有P中的8個點 ??
總結
以上是生活随笔為你收集整理的刷题记录(1)_HDU-1001→1010的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu.1430.魔板(bfs + 康托
- 下一篇: linux qtopia-2.2.0编译