总的说一下这次的情况,这次的状态不太好,期间各种小错误卡好久,freopen()不能用,也是醉了,A题题目描述有问题,就不说了,B题少考虑一种情况,G题把Yes输成YES,I题思路一直有啊,但当时一直混混沌沌的,代码写不出来,J题少写了个break,这么多低级错误,害我卡了好久,还好最后一小时的时候感觉渐渐回来了,一个个的BUG调出来了
比赛的时候卡水题真的是巨影响心情的
链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=76940#overview
HUST 1583:长度单位
A题太坑爹了,必须先转化为英寸,再转化为英尺才行
#include<stdio.h> #include<math.h> const double eps=1e-6; int main(){ int n; /*#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif */ while(scanf("%d",&n)!=EOF){ double a=n; int b=n/3; if((n%3)>1) b++; printf("%d %d\n",b/12,b%12); } }
HUST 1584 :摆放餐桌
求出每一个小圆要占大圆多少圆心角,连接两圆圆心,过大圆心作小圆切线,求出角度*2即为每个小圆占的角度,然后特判一下r>R的情况
#include<stdio.h> #include<math.h> const double PI=acos(-1.0); const double eps=1e-8; int main(){ //freopen("in.txt","r",stdin); int n; double R,r; while(scanf("%d%lf%lf",&n,&R,&r)!=EOF){ double c=R-r; double b=r; int num; if(r>R) num=0; else if(2*r>R) num=1; else if(fabs(2*r-R)<eps) num=2; else{ double q=asin(b/c)*2.0; num=floor(2.0*PI/q+eps); //printf("%f %f\n",2*PI,q); } if(n<=num) printf("YES\n"); else printf("NO\n"); } return 0; }
HUST 1583:排队
画下图,即可知求b+1和n-a的较小值
#include<stdio.h> #include<algorithm> using namespace std; int main(){ /*#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif*/ int n,a,b; while(scanf("%d%d%d",&n,&a,&b)!=EOF){ printf("%d\n",min(b+1,n-a)); } return 0; }
SCU 4424 :Permutations
一开始使劲在按原理求,都没想到直接在找规律,规律很简单的,a[i]=i*a[i-1]+i
然后用long long求模就行了
#include<stdio.h> #define mod 1000000007 typedef long long ll; long long a[8000005]; int main(){ a[0]=0; for(int i=1;i<=8000000;i++){ a[i]=((ll)i*(a[i-1]+1))%mod; } int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); printf("%lld\n",a[n]%mod); } }
HUST 1622:小明的三角形
任意两边大于第三边,然后判断一下是不是在一条直线上
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; const double PI=acos(-1.0); const double eps=1e-8; struct Point { double x,y; Point(){ } Point(double xx,double yy){ x=xx;y=yy; } Point operator-(Point b){ return Point(x-b.x,y-b.y); } double operator^(Point b){ return x*b.y-y*b.x; } }; double dist(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main(){ //freopen("in.txt","r",stdin); double x1,x2,x3,y1,y2,y3; double R,r; int T; scanf("%d",&T); while(T--){ scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3); Point p=Point(x1,y1); Point q=Point(x2,y2); Point r=Point(x3,y3); double a=dist(x1,y1,x2,y2); double b=dist(x1,y1,x3,y3); double c=dist(x2,y2,x3,y3); if( fabs((p-q)^(r-q))<eps) printf("No\n"); else{ if(a+b-eps>c||a+c-eps>b||b+c-eps>a) printf("Yes\n"); else printf("No\n"); } } }
HUST 1646:
这里求的是绝对值的最大值,即转化为求最大值和最小值,如果是求绝对值的最小值那就没办法了。。
dp[i]:表示以i结尾的区域的最大值或最小值,则
dp[i]=max(dp[i-1]+a[i],a[i])
dp[i]=main(dp[i-1]+a[i],a[i])
最后从头到尾扫描一遍
#include<stdio.h> #include<algorithm> #include<stdlib.h> //dp[i]:选中第i个数时的最大值 using namespace std; struct Node{ int ma,mi; }dp[100005]; int a[100005],s[100005]; int main(){ //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) s[i]+=s[i-1]; dp[1].ma=a[1]; dp[1].mi=a[1]; for(int i=2;i<=n;i++) { dp[i].ma=max(dp[i-1].ma+a[i],a[i]); dp[i].mi=min(dp[i-1].mi+a[i],a[i]); //printf("%d ",dp[i].mi); } int ans=0; for(int i=1;i<=n;i++){ ans=max(ans,abs(dp[i].ma)); ans=max(ans,abs(dp[i].mi)); } printf("%d\n",ans); } return 0; }
SCU 4416:Happy hkw
按价格从小到大排个序,则第i个价格必经前面的都大,这时只需要比较第i个的质量是否比前面质量的最大值小即可
#include<stdio.h> #include<algorithm> using namespace std; struct Node{ int p,q; }a[100005]; int cmp(Node a,Node b){ return a.p<b.p; } int main(){ //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) scanf("%d%d",&a[i].p,&a[i].q); sort(a,a+n,cmp); int ma=a[0].q,flag=1; for(int i=1;i<n;i++){ if(a[i].q<ma) { flag=0; printf("Happy xkw\n"); break; } ma=max(ma,a[i].q); } if(flag) printf("Poor xkw\n"); } return 0; }
时间: 2024-10-28 22:59:15