• NCEPU-2013-周练一 基本输入输出+排序 题解


    训练链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38178#overview

    A LightOJ 1000

     1 #include <cstdio>
     2 
     3 int main ()
     4 {
     5     int T;
     6     scanf("%d",&T);
     7     for (int Cas=1;Cas<=T;Cas++)
     8     {
     9         int a,b;
    10         scanf("%d%d",&a,&b);
    11         printf("Case %d: %d
    ",Cas,a+b);
    12     }
    13     return 0;
    14 }
    A LightOJ 1000

    B LightOJ 1001

    题意:将一个不超过20的数拆成任意两个不超过10的数。

     1 #include <cstdio>
     2 
     3 int main ()
     4 {
     5     int T;
     6     scanf("%d",&T);
     7     while (T--)
     8     {
     9         int n;
    10         scanf("%d",&n);
    11         if (n<=10)
    12             printf("0 %d
    ",n);
    13         else
    14             printf("%d %d
    ",n-10,10);
    15     }
    16     return 0;
    17 }
    B LightOJ 1001

    C LightOJ 1008

    找规律,我写的比较挫。。。。

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 
     5 int main ()
     6 {
     7     int T;
     8     scanf("%d",&T);
     9     for (int Cas=1;Cas<=T;Cas++)
    10     {
    11         long long s;
    12         scanf("%lld",&s);
    13         printf("Case %d: ",Cas);
    14         long long a=(long long)sqrt(s);
    15         if (a*a==s)
    16         {
    17             if (a%2==0)  //偶数的平方
    18                 printf("%lld 1
    ",a);
    19             else
    20                 printf("1 %lld
    ",a);
    21             continue;
    22         }
    23         s-=a*a;
    24         if (a%2==0)  //偶数的平方
    25         {
    26             if (s>a+1)
    27                 printf("%lld %lld
    ",2*a+1-s+1,a+1);
    28             else
    29                 printf("%lld %lld
    ",a+1,s);
    30         }
    31         else
    32         {
    33             if (s>a+1)
    34                 printf("%lld %lld
    ",a+1,2*a+1-s+1);
    35             else
    36                 printf("%lld %lld
    ",s,a+1);
    37         }
    38     }
    39     return 0;
    40 }
    View Code

    D Hdu 1029

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int N=1000005;
     5 
     6 int hash[N];
     7 
     8 int main ()
     9 {
    10     int n;
    11     while (~scanf("%d",&n))
    12     {
    13         int tmp,target=(n+1)/2,ans;
    14         memset(hash,0,sizeof(hash));
    15         for (int i=0;i<n;i++)
    16         {
    17             scanf("%d",&tmp);
    18             hash[tmp]++;
    19             if (hash[tmp]>=target)
    20                 ans=tmp;
    21         }
    22         printf("%d
    ",ans);
    23     }
    24     return 0;
    25 }
    View Code

    E Hdu 1040

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int data[1005];
     6 int main ()
     7 {
     8     int T,n,i;
     9     scanf("%d",&T);
    10     while (T--)
    11     {
    12         scanf("%d",&n);
    13         for (i=0;i<n;i++)
    14             scanf("%d",&data[i]);
    15         sort(data,data+n);
    16         for (i=0;i<n;i++)
    17             printf(i==n-1?"%d
    ":"%d ",data[i]);
    18     }
    19     return 0;
    20 }
    View Code

    F Hdu 1391

    这题我的代码依旧很挫,这个写法比较简练,我参照他的重写了一下。

    该题参考:http://hi.baidu.com/nicker2010/item/8ed121dbf0f66c32e2108fed

    我们从图中可以观察到以下信息:1.数字是盘旋上升的2.盘旋是有周期的,周期为4,因为我们将每4个数分为一组的话,{0,1,2,3},{4,5,6,7}....我们可以发现每一组的开始一个数分别是:0,4,8,12,16...,他们的坐标分别是:(0,0),(2,2),(4,4),(6,6),(8,8)...,因此我们首先可以根据坐标找出该坐标的数是属于哪一个组的,方法是:min(x,y)/2。再求该坐标的数在该组内的index,这个我们可以枚举!

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 #define min(a,b) ((a)<(b)?(a):(b))
     5 
     6 const int POS[][2]={{0,0},{1,1},{2,0},{3,1}};
     7 
     8 int main ()
     9 {
    10     int T,posX,posY,index;
    11     scanf("%d",&T);
    12     while (T--)
    13     {
    14         scanf("%d%d",&posX,&posY);
    15         int group = min(posX,posY)/2;  //每4个数一组,属于哪一组
    16         posX -= 2*group;
    17         posY -= 2*group;
    18         bool ok = false;
    19         for (int i=0;i<4;++i)  //该组内的第几个数
    20             if (POS[i][0]==posX && POS[i][1]==posY)
    21             {
    22                 index=i;
    23                 ok=true;
    24                 break;
    25             }
    26         if (ok==false)
    27             printf("No Number
    ");
    28         else
    29             printf("%d
    ",4*group+index);
    30     }
    31     return 0;
    32 }
    View Code

    G Hdu 1236

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N=1005;
     7 int n,m,g;
     8 
     9 int data[15];
    10 
    11 struct Node
    12 {
    13     char name[25];
    14     int num,score;
    15     void Get ()
    16     {
    17         score=0;
    18         scanf("%s%d",name,&num);
    19         while (num--)
    20         {
    21             int tmp;
    22             scanf("%d",&tmp);
    23             score+=data[tmp];
    24         }
    25     }
    26     bool operator < (const Node b) const
    27     {
    28         if (score==b.score)
    29             return strcmp(name,b.name)<0;
    30         return score>b.score;
    31     }
    32 }a[N];
    33 
    34 int main ()
    35 {
    36 #ifdef ONLINE_JUDGE
    37 #else
    38     freopen("read.txt","r",stdin);
    39 #endif
    40     while (scanf("%d",&n),n)
    41     {
    42         scanf("%d%d",&m,&g);
    43         int i;
    44         for (i=1;i<=m;i++)
    45             scanf("%d",&data[i]);
    46         for (i=0;i<n;i++)
    47             a[i].Get();
    48         sort(a,a+n);
    49         int cnt=0;
    50         for (i=0;i<n;i++)
    51             if (a[i].score>=g)
    52                 cnt++;
    53             else
    54                 break;
    55         printf("%d
    ",cnt);
    56         for (i=0;i<cnt;i++)
    57             printf("%s %d
    ",a[i].name,a[i].score);
    58     }
    59     return 0;
    60 }
    View Code

    H Hdu 1872

    排错的优先级比不稳定排序优先级高,即需要先判断是否排错

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N=305;
     7 int n;
     8 
     9 struct Node
    10 {
    11     char name[55];
    12     int score;
    13     void Get ()
    14     {
    15         scanf("%s%d",name,&score);
    16     }
    17     bool operator < (const Node b) const
    18     {
    19         return score>b.score;
    20     }
    21 }data[N],after[N];
    22 
    23 bool Judge ()
    24 {
    25     for (int i=0;i<n-1;i++)
    26         if (after[i].score<after[i+1].score)
    27             return false;
    28     return true;
    29 }
    30 
    31 bool Same ()
    32 {
    33     bool flag=true;
    34     for (int i=0;i<n;i++)
    35         if (strcmp(data[i].name,after[i].name))
    36         {
    37             flag=false;
    38             break;
    39         }
    40     return flag;
    41 }
    42 
    43 void Output ()
    44 {
    45     for (int i=0;i<n;i++)
    46         printf("%s %d
    ",data[i].name,data[i].score);
    47 }
    48 
    49 int main ()
    50 {
    51 #ifdef ONLINE_JUDGE
    52 #else
    53     freopen("read.txt","r",stdin);
    54 #endif
    55     while (~scanf("%d",&n))
    56     {
    57         int i;
    58         for (i=0;i<n;i++)
    59             data[i].Get();
    60         stable_sort(data,data+n);
    61         for (i=0;i<n;i++)
    62             after[i].Get();
    63         if (Judge()==false)
    64         {
    65             printf("Error
    ");
    66             Output();
    67             continue;
    68         }
    69         if (Same())
    70             printf("Right
    ");
    71         else
    72         {
    73             printf("Not Stable
    ");
    74             Output();
    75         }
    76     }
    77     return 0;
    78 }
    View Code

    I Hdu 2608

    坑爹找规律+数论,思路可以参考:http://www.cnblogs.com/Lyush/archive/2011/07/31/2123163.html

     1 #include <cstdio>
     2 #include <cmath>
     3 
     4 int main ()
     5 {
     6     int T,n;
     7     scanf("%d",&T);
     8     while (T--)
     9     {
    10         scanf("%d",&n);
    11         int m=(int)sqrt(n)+(int)sqrt(n/2);
    12         printf("%d
    ",m%2);
    13     }
    14     return 0;
    15 }
    View Code

    J UVa 10420

    题意:给出人数n,接下来n行,第一个单词是该人的国家,剩下的是他的名字。按照字典序输出每个国家有多少人。

    这个题练习了一下STL中map自定义排列顺序……不用map也可以实现。

     1 #pragma warning(disable:4786)
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <string>
     6 #include <map>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 const int N=2005;
    11 
    12 struct cmp
    13 {
    14     bool operator () (const string a,const string b)
    15     {
    16         return a<b;
    17     }
    18 };
    19 
    20 map<string,int,cmp> m;
    21 
    22 int main ()
    23 {
    24     int n;
    25     scanf("%d",&n);
    26     string str;
    27     char ch[100];
    28     for (int i=0;i<n;i++)
    29     {
    30         cin>>str;
    31         gets(ch);
    32         m[str]++;
    33     }
    34     map<string,int,cmp>::iterator it;
    35     for (it=m.begin();it!=m.end();it++)
    36         cout<<(*it).first<<" "<<(*it).second<<endl;
    37     return 0;
    38 }
    View Code

    K UVA 152

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 
     5 const int N=5005;
     6 int ans[10];
     7 
     8 struct Node
     9 {
    10     int x,y,z;
    11     bool Get ()
    12     {
    13         scanf("%d%d%d",&x,&y,&z);
    14         if (x||y||z) return true;
    15         return false;
    16     }
    17     double Dis (Node b)
    18     {
    19         return sqrt(1.0*(x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z));
    20     }
    21 }data[N];
    22 
    23 int main ()
    24 {
    25     int n=0,i=0;
    26     while (data[i].Get()) n++,i++;
    27     memset(ans,0,sizeof(ans));
    28     for (i=0;i<=n;i++)
    29     {
    30         double tmp=255*255;
    31         for (int j=0;j<=n;j++)
    32         if (i!=j)
    33         {
    34             double dis=data[i].Dis(data[j]);
    35             if (dis<tmp)
    36             {
    37                 tmp=dis;
    38             }
    39         }
    40         ans[(int)tmp]++;
    41     }
    42     for (i=0;i<10;i++)
    43         printf("%4d",ans[i]);
    44     printf("
    ");
    45     return 0;
    46 }
    View Code

    L UVA 156

    STL多重映照容器multimap+set实现简单些,不用这个也可以

     1 #pragma warning(disable:4786)
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <string>
     6 #include <map>
     7 #include <set>
     8 #include <algorithm>
     9 using namespace std;
    10 
    11 multimap<string,string> mm;
    12 set<string> s;
    13 string origin;
    14 char str[25];
    15 
    16 int main ()
    17 {
    18     while (scanf("%s",str),str[0]!='#')
    19     {
    20         origin=str;
    21         for (int i=0;str[i];i++)
    22             if (isupper(str[i]))
    23                 str[i]=tolower(str[i]);
    24         sort(str,str+strlen(str));
    25         mm.insert(pair<string,string>(str,origin));
    26     }
    27     multimap<string,string>::iterator it;
    28     for (it=mm.begin();it!=mm.end();it++)
    29         if (mm.count(it->first)==1)
    30             s.insert(it->second);
    31     set<string,string>::iterator p;
    32     for (p=s.begin();p!=s.end();p++)
    33         cout<<*p<<endl;
    34     return 0;
    35 }
    View Code

    M Poj 3627

    题意:最少多少头牛叠罗汉可以不低于指定高度

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int data[20005];
     6 
     7 bool cmp (int a,int b)
     8 {
     9     return a>b;
    10 }
    11 
    12 int main ()
    13 {
    14     int n,b;
    15     while (~scanf("%d%d",&n,&b))
    16     {
    17         int i,sum=0;
    18         for (i=0;i<n;i++)
    19             scanf("%d",&data[i]);
    20         sort(data,data+n,cmp);
    21         for (i=0;i<n;i++)
    22         {
    23             sum+=data[i];
    24             if (sum>=b) break;  //>=
    25         }
    26         printf("%d
    ",i+1);
    27     }
    28     return 0;
    29 }
    View Code

    N Poj 3646

    题意:一个骑士可以击杀一只实力比他低的龙,同时消耗他实力这么多的钱,问最少花费

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int N=20005;
     6 
     7 int dragon[N],knight[N];
     8 
     9 int main ()
    10 {
    11     int n,m;
    12     while (scanf("%d%d",&n,&m),n||m)
    13     {
    14         int i,j,sum=0;
    15         for (i=0;i<n;i++)
    16             scanf("%d",&dragon[i]);
    17         for (i=0;i<m;i++)
    18             scanf("%d",&knight[i]);
    19         if (m<n)
    20         {
    21             printf("Loowater is doomed!
    ");
    22             continue;
    23         }
    24         sort(dragon,dragon+n);
    25         sort(knight,knight+m);
    26         for (i=0,j=0;i<n;)
    27         {
    28             if (knight[j]>=dragon[i])
    29             {
    30                 sum+=knight[j];
    31                 i++,j++;
    32             }
    33             else
    34                 j++;
    35             if (j==m) break;
    36         }
    37         if (i==n)
    38             printf("%d
    ",sum);
    39         else
    40             printf("Loowater is doomed!
    ");
    41     }
    42     return 0;
    43 }
    View Code

    O Hdu 2379

    基础DP,dp[i][j]表示用i个单词构成长度为j的密码的方法数,这题同一个单词可以反复用

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 __int64 dp[6][55],hash[15];
     5 char str[15];
     6 
     7 int main ()
     8 {
     9     int T;
    10     scanf("%d",&T);
    11     while (T--)
    12     {
    13         int m,n,q,i;
    14         scanf("%d%d%d",&m,&n,&q);
    15         memset(dp,0,sizeof(dp));
    16         memset(hash,0,sizeof(hash));
    17         for (i=0;i<m;i++)
    18         {
    19             scanf("%s",str);
    20             int len=strlen(str);
    21             hash[len]++;
    22         }
    23         for (i=1;i<=10;i++)
    24             dp[1][i]=hash[i];
    25         for (i=2;i<=n;i++) for (int j=1;j<=50;j++)
    26             for (int k=1;k<=10;k++)
    27                 if (j-k>0)
    28                     dp[i][j]+=dp[i-1][j-k]*hash[k];
    29         for (i=1;i<=q;i++)
    30         {
    31             int tmp;
    32             scanf("%d",&tmp);
    33             printf("%I64d
    ",dp[n][tmp]);
    34         }
    35     }
    36     return 0;
    37 }
    View Code

    P Poj 3663

    直接找也能过,用upper_bound找快一些。

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int data[20005];
     6 
     7 int main ()
     8 {
     9     int n,s;
    10     while (~scanf("%d%d",&n,&s))
    11     {
    12         int i;
    13         for (i=0;i<n;i++)
    14             scanf("%d",&data[i]);
    15         sort(data,data+n);
    16         int ans=0;
    17         for (i=0;i<n;i++)
    18         {
    19             int k=upper_bound(data+i,data+n,s-data[i])-data;
    20             k--;
    21             if (k>i) ans+=k-i;
    22             else break;
    23         }
    24         printf("%d
    ",ans);
    25     }
    26     return 0;
    27 }
    View Code

    Q Poj 3664

    开会时的例题就是这道。

    两次排序即可。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N=50005;
     7 
     8 class Node
     9 {
    10 public:
    11     int id,f,s;
    12     void Get (int a)
    13     {
    14         id=a+1;
    15         scanf("%d%d",&f,&s);
    16     }
    17     bool operator < (const Node b) const
    18     {
    19         return f>b.f;
    20     }
    21 }data[N];
    22 
    23 bool cmp (const Node a,const Node b)
    24 {
    25     return a.s>b.s;
    26 }
    27 
    28 int main ()
    29 {
    30     int n,k;
    31     while (~scanf("%d%d",&n,&k))
    32     {
    33         int i;
    34         for (i=0;i<n;i++)
    35             data[i].Get(i);
    36         sort(data,data+n);
    37         sort(data,data+k,cmp);
    38         printf("%d
    ",data[0].id);
    39     }
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    SOA精华的内容和实用的知识
    众多SEO专家集体盛赞
    黑客大曝光:VoIP安全机密与解决方案
    博文视点大讲堂41期SEO难点之网站内部链接结构
    TransactSQL管理与开发实例精粹
    千万不要错过云计算兴起的时代
    《海量数据库解决方案》之位图索引的结构和特征
    Oracle开发艺术
    Android应用程序的开发
    BizTalk Accelerator for HL7医疗行业消息路由处理机制
  • 原文地址:https://www.cnblogs.com/whyorwhnt/p/3470228.html
Copyright © 2020-2023  润新知