1、110401/10041 Vito’s Family (Vito 家族)
距离最小的点必定是中位数,必定出现在输入的点之间
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<ctype.h> using namespace std; int s[505]; int dis[30005]; const int INF=1000000000; int main() { int T,r; scanf("%d",&T); while(T--) { scanf("%d",&r); int j,i,sum=0; memset(dis,0,sizeof(dis)); for(i=0;i<r;i++) { scanf("%d",&s[i]); } for(i=0;i<r;i++) { int x=s[i]; for(j=0;j<r;j++) { dis[x]+=abs(s[j]-x); } } int d=INF; for(i=0;i<r;i++) if(dis[s[i]]<d)d=dis[s[i]]; printf("%d ",d); } return 0; }
2、110402/120 Stacks of Flapjacks (煎饼堆)
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<ctype.h> using namespace std; int p[35]; int s[35]; char cmd[100]; int k=0; void read() { int len=strlen(cmd),i,tot=0; k=0; for(i=0;i<=len;i++) { if(i<len&&cmd[i]!=' ') { tot=tot*10+cmd[i]-'0'; } else { if(tot==0)continue; p[k++]=tot; tot=0; } } } int main() { while(gets(cmd)!=NULL) { read(); int i,j,t; for(i=0;i<k;i++) { if(i)printf(" "); printf("%d",p[i]); s[i]=p[i]; } printf(" "); sort(s,s+k); for(i=k-1;i>0;i--) { if(p[i]==s[i])continue; for(j=1;j<i&&p[0]!=s[i];j++) { if(p[j]==s[i]) { printf("%d ",k-j); for(t=0;t<=j/2;t++) swap(p[t],p[j-t]); } } printf("%d ",k-i); for(t=0;t<=i/2;t++) swap(p[t],p[i-t]); } printf("0 "); } return 0; } /* 8 4 6 7 5 2 1 5 6 2 3 4 */
3、110403/10037 Bridge (过桥)
贪心算法
1》最快和次快过桥,最快回来,最慢和次慢过桥,次快回来
使用时间2*p[0]+p[i]+p[i-1];
2》最快和最慢过桥,最快回来,最快和次慢过桥,最快回来
使用时间2*p[1]+p[0]+p[i];
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; int p[1005]; int rnd[2005][5]; int tot[2005]; void pass(int cnt,int t,int a,int b) { tot[cnt]=t; rnd[cnt][0]=p[a]; if(t>=2)rnd[cnt][1]=p[b]; } int main() { int T; scanf("%d",&T); while(T--) { int n,i; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&p[i]); } sort(p,p+n); int sum=0; int cnt=0; for(i=n-1;i>2;i-=2) { if(2*p[1]+p[0]+p[i]>2*p[0]+p[i]+p[i-1]) { sum+=2*p[0]+p[i]+p[i-1]; pass(cnt++,2,0,i-1); pass(cnt++,1,0,-1); pass(cnt++,2,0,i); pass(cnt++,1,0,-1); } else { sum+=2*p[1]+p[0]+p[i]; pass(cnt++,2,0,1); pass(cnt++,1,0,-1); pass(cnt++,2,i-1,i); pass(cnt++,1,1,-1); } } if(i==2) { sum+=p[0]+p[1]+p[2]; pass(cnt++,2,0,1); pass(cnt++,1,0,-1); pass(cnt++,2,0,2); } if(i==1) { sum+=p[1]; pass(cnt++,2,0,1); } if(i==0) { sum+=p[0]; pass(cnt++,1,0,-1); } printf("%d ",sum); for(i=0;i<cnt;i++) { for(int j=0;j<tot[i];j++) { if(j)printf(" "); printf("%d",rnd[i][j]); } printf(" "); } if(T)printf(" "); } return 0; }
4、110404/10191 Longest Nap (最长打盹时间)
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> using namespace std; struct NODE { int s,e; }ap[105]; bool cmp(NODE a,NODE b) { return a.s<b.s; } int main() { int d; int day=1; while(scanf("%d",&d)!=EOF) { int i; char app[260]; int sh,eh,sm,em; for(i=0;i<d;i++) { scanf("%d:%d %d:%d",&sh,&sm,&eh,&em); gets(app); ap[i].s=sh*60+sm; ap[i].e=eh*60+em; } sort(ap,ap+d,cmp); int max=ap[0].s-10*60,tmp; int sta=10*60; for(i=1;i<d;i++) { tmp=ap[i].s-ap[i-1].e; if(max<tmp) { max=tmp; sta=ap[i-1].e; } } tmp=18*60-ap[d-1].e; if(max<tmp) { max=tmp; sta=ap[d-1].e; } printf("Day #%d: the longest nap starts at %d:%02d and will last for ",day++,sta/60,sta%60); if(max<60)printf("%d minutes. ",max); else printf("%d hours and %d minutes. ",max/60,max%60); } return 0; } /* 4 11:00 12:00 Lectures 12:00 13:00 Lunch, like always. 13:00 15:00 Boring lectures... 15:30 15:45 Reading */
5、110406/10138 CDVII (CDVII 高速公路)
注意点:1、没有消费的车不输出
2、采样的汽车位置可能exit的位置小于enter的位置
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<ctype.h> #include<map> #include<string> using namespace std; typedef long long lld; const int inf=1003; int fare[24]; int h[inf],nxt[inf]; struct PHOTO { char p[100]; }photo[inf]; map<string,int> m; struct NODE { int h,m; int dis; char w; }nod[inf]; bool cmp(PHOTO a,PHOTO b) { return strcmp(a.p,b.p)>0; } char name [inf][23]; typedef long long lld; int trans(char tmp[]) { int i,len=strlen(tmp),tot=0; for(i=0;i<len;i++) tot=tot*10+tmp[i]-'0'; return tot; } double calc(int t) { int i,dis,st; double tot=2; bool sta=true; for(i=h[t];i!=-1;i=nxt[i]) { if(nod[i].w==0) { dis=nod[i].dis; st=nod[i].h; sta=false; } if(nod[i].w==1&&!sta) { dis=abs(nod[i].dis-dis); tot+=dis*fare[st]*1.0/100+1; sta=true; } } return tot; } int main() { int T; scanf("%d",&T); while(T--) { int i,j; memset(h,-1,sizeof(h)); memset(nxt,-1,sizeof(nxt)); for(i=0;i<24;i++)scanf("%d",&fare[i]); int n=0; getchar(); while(gets(photo[n].p)!=NULL) { if(photo[n].p[0]=='