題意:是用兩個指針的一個模擬時鐘的時針和分針。兩個指針形成一個角度。角度測量兩個指針之間的最小角度。兩只手之間的角度是大於或等於0,且小於或等於180度的度量。由於一個序列的五個不同的寫入時間,格式為hh:mm,其中......是兩個數字較完整的24小時( 00 <= ...... <= 23)和mm(00 <=毫米<= 59),你發現的中位數,也就是寫一個程序,第三個元素的排序序列在兩個數字代表分鐘非遞減順序及其關聯的角度。例如,假設您將得到一個序列(06:05,07:10,03:00,21:00,下午12:55)次。關系被打破這樣一種方式,一個較早的時間排在稍後的時間之前。因為排序的序列(12:55,03:00,21:00,06:05,07:10),你輸出的是21:00。
http://acm.hdu.edu.cn/showproblem.php?pid=1209
題解:排序;
錯誤分析:1:小時和分鐘不一定是整10或5;
2:時針隨著分針的變化而變化;所以時針與12的角度為angle=(hh+mm/60)*30;
3:輸出格式可以用printf("%02d%02d",time[2].hh,time[2].mm);
上網搜了一個解題報告看到了這種數出格式,然後就試了一下,發現比我寫的
if(time[2].hh<10) printf("0%d",time[2].hh); else printf("%d",time[2].hh); if(time[2].mm<10) printf(":0%d\n",time[2].mm); else printf(":%d\n",time[2].mm); if(time[2].hh<10) printf("0%d",time[2].hh); else printf("%d",time[2].hh); if(time[2].mm<10) printf(":0%d\n",time[2].mm); else printf(":%d\n",time[2].mm);
好用多了,然後就百度一下解釋:
2是寬度很簡單。如果整數不夠2列就補上0
比如
printf("%02d" ,3);
結果就是
03
如果大於2沒有影響
printf("%02d",1234);
1234
代碼實現
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef struct clock { int hh; int mm; double angle; }clock; clock time[6]; bool cmp( clock x1,clock x2 )//比較 { if(x1.angle==x2.angle) { if(x1.hh==x2.hh) return(x1.mm<x2.mm); return (x1.hh<x2.hh); } return x1.angle<x2.angle; } int main() { int t,h,m; double angle1,angle2,angle3; scanf("%d",&t); while(t--) { for(int i=0;i<5;i++) { scanf("%d:%d",&h,&m); time[i].hh=h; time[i].mm=m; angle1=30*(h%12)+m*0.5;//時針與0時的角度; angle2=m*6;//分針與0分的角度 angle3=fabs(angle1-angle2); if(angle3>180)angle3=360.0-angle3; time[i].angle=angle3; } sort(time,time+5,cmp);//排序 printf("%02d:%02d\n",time[2].hh,time[2].mm); } return 0; } #include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef struct clock { int hh; int mm; double angle; }clock; clock time[6]; bool cmp( clock x1,clock x2 )//比較 { if(x1.angle==x2.angle) { if(x1.hh==x2.hh) return(x1.mm<x2.mm); return (x1.hh<x2.hh); } return x1.angle<x2.angle; } int main() { int t,h,m; double angle1,angle2,angle3; scanf("%d",&t); while(t--) { for(int i=0;i<5;i++) { scanf("%d:%d",&h,&m); time[i].hh=h; time[i].mm=m; angle1=30*(h%12)+m*0.5;//時針與0時的角度; angle2=m*6;//分針與0分的角度 angle3=fabs(angle1-angle2); if(angle3>180)angle3=360.0-angle3; time[i].angle=angle3; } sort(time,time+5,cmp);//排序 printf("%02d:%02d\n",time[2].hh,time[2].mm); } return 0; }
排序的相關題目
HDU1029 Ignatius and the Princess IV
代碼
#include<cstdio> #include<algorithm> #define MAX 1000000 using namespace std; int a[MAX]; int main() { int i,n; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int flag=a[0],count=0; for(i=0;i<n;i++) { if(flag==a[i]) { count++; if((n+1)/2<=count)break; } else { flag=a[i]; count=1; } } printf("%d\n",a[i]); } return 0; } #include<cstdio> #include<algorithm> #define MAX 1000000 using namespace std; int a[MAX]; int main() { int i,n; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int flag=a[0],count=0; for(i=0;i<n;i++) { if(flag==a[i]) { count++; if((n+1)/2<=count)break; } else { flag=a[i]; count=1; } } printf("%d\n",a[i]); } return 0; }
HDU2673shǎ崽 OrOrOrOrz
#include<cstdio> #include<algorithm> using namespace std; int a[10005]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); printf("%d %d",a[n-1],a[0]); for(int i=1;i<n/2;i++) printf(" %d %d",a[n-i-1],a[i]); if(n%2==1) printf(" %d",n/2+1); printf("\n"); } return 0; } #include<cstdio> #include<algorithm> using namespace std; int a[10005]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); printf("%d %d",a[n-1],a[0]); for(int i=1;i<n/2;i++) printf(" %d %d",a[n-i-1],a[i]); if(n%2==1) printf(" %d",n/2+1); printf("\n"); } return 0; }
HDU1280前m大的數
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; bool mysort(int x,int y) { return(x>y); } int b[45000000]; int main() { int i,j,k,n,m,a[3002]; while(scanf("%d %d",&n,&m)!=EOF) { k=0; for(i=0;i<n;i++) scanf("%d",&a[i]);//輸入 for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) b[k++]=a[i]+a[j];//兩兩相加的和 sort(b,b+n*(n-1)/2,mysort);//排序 printf("%d",b[0]);//控制輸出格式 for(i=1;i<m;i++) printf(" %d",b[i]); printf("\n"); } return 0; } #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; bool mysort(int x,int y) { return(x>y); } int b[45000000]; int main() { int i,j,k,n,m,a[3002]; while(scanf("%d %d",&n,&m)!=EOF) { k=0; for(i=0;i<n;i++) scanf("%d",&a[i]);//輸入 for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) b[k++]=a[i]+a[j];//兩兩相加的和 sort(b,b+n*(n-1)/2,mysort);//排序 printf("%d",b[0]);//控制輸出格式 for(i=1;i<m;i++) printf(" %d",b[i]); printf("\n"); } return 0; }