致初学者(三): HDU 2033~ 2043题解
下面继续给出HDU 2033~2043的AC程序,供大家参考。2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”。
HDU 2033:人见人爱A+B
简单分支结构。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int n,ah,am,as,bh,bm,bs; scanf("%d",&n); while (n--) { scanf("%d%d%d%d%d%d",&ah,&am,&as,&bh,&bm,&bs); bs+=as; if (bs>=60) { bm+=bs/60; bs=bs%60; } bm+=am; if (bm>=60) { bh+=bm/60; bm=bm%60; } bh+=ah; printf("%d %d %d\n",bh,bm,bs); } return 0; }
HDU 2034:人见人爱A-B
设用数组a,b,c分别表示集合A,B,C,其中 C=A-B。
用循环 for (i=0;i<n;i++) 处理集合A中的每个元素a[i],对于元素a[i] 用循环 for (j=0;j<m;j++) 在集合B中查找a[i]是否在集合B中存在,如果a[i]不在集合B中出现,则将a[i]保存到数组c中,作为集合C的一个元素。
得到数组c后,输出前采用冒泡排序按从小到大的顺序对数组c进行排序。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int n,m,i,j,cnt,t; int a[101],b[101],c[101]; while (1) { scanf("%d%d",&n,&m); if (n==0 && m==0) break; for (i=0;i<n;i++) // 输入集合A的元素 scanf("%d",&a[i]); for (i=0;i<m;i++) // 输入集合B的元素 scanf("%d",&b[i]); cnt=0; // 集合C=A-B的元素个数 for (i=0;i<n;i++) { for (j=0;j<m;j++) // 查找当前集合A的元素a[i]是否在集合B中存在 if (a[i]==b[j]) break; if (j==m) // 如果a[i]不在集合B中出现 c[cnt++]=a[i]; } if (cnt==0) printf("NULL\n"); else { for (i=0;i<cnt-1;i++) //用冒泡法排序 for (j=0;j<cnt-1-i;j++) if (c[j]>c[j+1]) { t=c[j]; c[j]=c[j+1]; c[j+1]=t; } for (i=0;i<cnt;i++) { printf("%d ",c[i]); } printf("\n"); } } return 0; }
HDU 2035:人见人爱A^B
采用快速幂运算完成A^B的计算。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int mod_pow(int x,int n,int m) // 快速幂运算 { int ret=1; while (n!=0) { if (n&1) ret=ret*x%m; x=x*x%m; n/=2; } return ret; } int main() { int a,b; while (1) { scanf("%d%d",&a,&b); if (a==0 && b==0) break; printf("%d\n",mod_pow(a,b,1000)); } return 0; }
HDU 2036:改革春风吹满地
利用向量积(叉积)计算多边形的面积公式为:
对于此公式推导过程有兴趣的同学可以参阅网上的一篇博文“利用向量积(叉积)计算三角形的面积和多边形的面积”。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int i,n,x[101],y[101]; double sum; while (scanf("%d",&n) && n!=0) { for (i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]); sum=0; for(i=1;i<n;i++) sum+=x[i-1]*y[i]-x[i]*y[i-1]; sum+=x[n-1]*y[0]-x[0]*y[n-1]; printf("%.1lf\n",0.5*sum); } return 0; }
HDU 2037:今年暑假不AC
定义一个结构体
struct showtime
{
int begin;
int end;
};
用于保存电视节目的开始时间和结束时间。定义结构体数组show[101]保存输入的电视节目情况。
采用贪心法求解。将电视节目(即结构体数组show)按结束时间从小到大排列(若结束时间系统,则按开始时间从大到小)。
先设lastend=show[0].end,因为第1个元素的结束时间一定是最早的,然后从左到右遍历数组各元素,若当前元素的开始时间大于lastend,则可以看一个完整节目,计数,同时修改lastend使之等于当前元素的结束时间。直到数组全部元素遍历完。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <algorithm> using namespace std; struct showtime { int begin; int end; }; bool cmp(showtime a ,showtime b) { if(a.end != b.end) return a.end < b.end; else return a.begin > b.begin; } int main() { showtime show[101]; int n,i,cnt,lastend; while (scanf("%d",&n) && n!=0) { for (i = 0;i<n;i++) { scanf("%d%d",&show[i].begin,&show[i].end); } sort(show,show+n,cmp); cnt = 1; lastend = show[0].end; for (i = 0;i < n ;i++) { if(lastend <= show[i].begin) { cnt++; lastend = show[i].end; } } printf("%d\n",cnt); } return 0; }
HDU 2039:三角形
简单分支结构。输入三角形三条边后,若满足任意两边的和大于第3条边,则可以构成一个三角形。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int m; double a,b,c; scanf("%d",&m); while (m--) { scanf("%lf%lf%lf",&a,&b,&c); if (a+b>c && a+c>b && b+c>a) printf("YES\n"); else printf("NO\n"); } return 0; }
HDU 2040:亲和数
抽象一个函数 int calcSum(int n)用于计算整数n的所有真因子之和。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <math.h> int calcSum(int n) { int sum=1,i,t; t=(int)sqrt(1.0*n); for (i=2;i<=t;i++) if (n%i==0) sum+=i+n/i; return sum; } int main() { int m,a,b; scanf("%d",&m); while (m--) { scanf("%d%d",&a,&b); if (calcSum(a)==b && calcSum(b)==a) printf("YES\n"); else printf("NO\n"); } return 0; }
HDU 2041:超级楼梯
设 f[i]表示上到第i级楼梯的方法数。显然上到第i级,可以在第i-1级楼梯跨1级到达;或者在第i-2级楼梯跨2级到达。
故有 f[i]=f[i-1]+f[i-2]。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int n,m,i; int f[41]={0,1,1}; for (i=3;i<=40;i++) f[i]=f[i-1]+f[i-2]; scanf("%d",&n); while (n--) { scanf("%d",&m); printf("%d\n",f[m]); } return 0; }
HDU 2042:不容易系列之二
简单迭代处理。迭代初值num=3,迭代式为: num=2*(num-1); 。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> int main() { int n,a,i,num; scanf("%d",&n); while (n--) { scanf("%d",&a); num=3; for (i=1;i<=a;i++) num=2*(num-1); printf("%d\n",num); } return 0; }
HDU 2043:密码
简单字符串处理。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> int main() { int m,i,f1,f2,f3,f4; char str[51]; scanf("%d",&m); while (m--) { scanf("%s",str); if (strlen(str)<8 || strlen(str)>16) printf("NO\n"); else { f1=f2=f3=f4=0; for (i=0;str[i]!='\0';i++) if (str[i]>='0' && str[i]<='9') f3=1; else if (str[i]>='A' && str[i]<='Z') f1=1; else if (str[i]>='a' && str[i]<='z') f2=1; else f4=1; if (f1+f2+f3+f4>=3) printf("YES\n"); else printf("NO\n"); } } return 0; }