程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU1029時鐘(排序)

HDU1029時鐘(排序)

編輯:C++入門知識

題意:是用兩個指針的一個模擬時鐘的時針和分針。兩個指針形成一個角度。角度測量兩個指針之間的最小角度。兩只手之間的角度是大於或等於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;
}

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved