2012年金华赛区现场赛A题。
水题,排序后解决。
对于两个 a1,b1 和a2,b2;
先1后2:a1+a2+a1*b2
先2后1: a1+a2+b1*a2;
1排在2前面的条件就是: a1*b2<b1*a2.
所以按照这个条件排序,然后出结果就可以了。
代码实现主要是要处理,会超出int的,最好用long long,或者乘之前强制转换下。
代码:
HDU 4442
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int MAXN=100010; const int MOD=365*24*60*60; struct Node { int a,b; }node[MAXN]; bool cmp(Node a,Node b) { return (long long)a.a*b.b<(long long)b.a*a.b; } int main() { int n; while(scanf("%d",&n)==1 && n) { for(int i=0;i<n;i++) scanf("%d%d",&node[i].a,&node[i].b); sort(node,node+n,cmp); long long ans=0; long long t=0; for(int i=0;i<n;i++) { ans+=(node[i].a+t*node[i].b)%MOD; ans%=MOD; t+=(node[i].a+t*node[i].b)%MOD; t%=MOD; } printf("%I64d\n",ans); } return 0; }
2012年金华赛区I题
这题就不解释了,签到题。求n个数的平方和
区域赛出的这么水,有意思么。。。基本上全部1A了。
HDU 4450
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> using namespace std; int main() { int n; int a; while(scanf("%d",&n)==1&&n) { int ans=0; while(n--) { scanf("%d",&a); ans+=a*a; } printf("%d\n",ans); } return 0; }
2012年金华赛区J题
水题一枚。
就是有N件衣服,M件裤子,K件鞋子。
有一些衣服和裤子是搭配不和谐的,有一些裤子和鞋子是搭配不和谐的。
问有多少种搭配衣服+裤子+鞋子,使得不存在不和谐的。
很简单,不要想得太多。
最直接的方法是枚举每一件组合,找出符合的,复杂度O(N*M*K),这个肯定是超时的。。。
可以降低一维。
枚举每一件衣服和裤子的组合,如果衣服和裤子可以搭配,则看该条裤子可以和多少件鞋子搭配。累加就可以了。
这个的复杂度是O(N*M).这个对于这题已经可以AC了,虽然效率没有很高。
还可以再降低一维。
枚举每条裤子,可以和这条裤子搭配的衣服数乘以可以和这条衣服搭配的鞋子数。累加起来就是答案。
复杂度O(M).
代码,按照第二种思路写的。
HDU 4451
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int MAXN=1010; int a[MAXN][MAXN],b[MAXN][MAXN]; int c[MAXN]; int main() { int N,M,K; int P; char str1[20],str2[20]; int t1,t2; while(scanf("%d%d%d",&N,&M,&K)==3) { if(N==0&&M==0&&K==0)break; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%d",&P); while(P--) { scanf("%s%d%s%d",&str1,&t1,&str2,&t2); if(strcmp(str1,"clothes")==0) { a[t1][t2]=1; } else { if(b[t1][t2]==0) { b[t1][t2]=1; c[t1]++; } } } int ans=0; for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) if(a[i][j]==0) ans+=(K-c[j]); printf("%d\n",ans); } return 0; }
2012年金华赛区K题
简单模拟,一秒一秒模拟过去就可以了。
注意0秒时不要左转。还有,假如相撞了,交换方向,不左转了。
HDU 4452
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; int n; int x1,y1; int x2,y2; int dir1,dir2;//0北,1西,2南,3东 int s1,t1; int s2,t2; void action(int t) { if(x1==x2&&y1==y2)swap(dir1,dir2); else { if(t!=0 && t%t1==0){dir1+=1;dir1%=4;} if(t!=0 && t%t2==0){dir2+=1;dir2%=4;} } for(int i=0;i<s1;i++) { if(dir1==0&&x1==1)dir1+=2,dir1%=4; if(dir1==1&&y1==1)dir1+=2,dir1%=4; if(dir1==2&&x1==n)dir1+=2,dir1%=4; if(dir1==3&&y1==n)dir1+=2,dir1%=4; if(dir1==0)x1--; else if(dir1==1)y1--; else if(dir1==2)x1++; else y1++; } for(int i=0;i<s2;i++) { if(dir2==0&&x2==1)dir2+=2,dir2%=4; if(dir2==1&&y2==1)dir2+=2,dir2%=4; if(dir2==2&&x2==n)dir2+=2,dir2%=4; if(dir2==3&&y2==n)dir2+=2,dir2%=4; if(dir2==0)x2--; else if(dir2==1)y2--; else if(dir2==2)x2++; else y2++; } //printf("%d %d %d %d\n",x1,y1,x2,y2); } int main() { char str1[10],str2[10]; while(scanf("%d",&n)==1 && n) { scanf("%s%d%d",&str1,&s1,&t1); scanf("%s%d%d",&str2,&s2,&t2); x1=1,y1=1; x2=n,y2=n; if(str1[0]=='N')dir1=0; else if(str1[0]=='W') dir1=1; else if(str1[0]=='S') dir1=2; else dir1=3; if(str2[0]=='N')dir2=0; else if(str2[0]=='W') dir2=1; else if(str2[0]=='S') dir2=2; else dir2=3; int K; scanf("%d",&K); for(int i=0;i<K;i++)action(i); printf("%d %d\n%d %d\n",x1,y1,x2,y2); } return 0; }