总的说一下这次的情况,这次的状态不太好,期间各种小错误卡好久,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");
}
}
}
辗转数对:
枚举另一个数,然后逆推就可以了
#include<stdio.h>
#include<algorithm>
using namespace std;
const int inf=999999999;
int n;
int solve(int n,int i){
if(i==1) return n-1;
int s=n/i;
int a=n%i,b=i;
if(a<1 || b<1) return inf;
if(a>b) swap(a,b);
s+=solve(b,a);
return s;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int ans=inf;
if(n==1) ans=0;
for(int i=1;i<=n/2;i++){
//if(n%i==0) continue;
ans=min(solve(n,i),ans);
}
printf("%d\n",ans);
}
}
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;
}