2015_7
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=73872#status//-/0/ 密码123
a 每个区间输出对应字符串 水题看姿势
1 #include<cstdio> 2 int a[]={1,5,10,20,50,100,250,500,1000,2001}; 3 char b[][16]={"few","several","pack","lots","horde","throng","swarm","zounds","legion"}; 4 int main(){ 5 int n; 6 while(~scanf("%d",&n)){ 7 for(int i=0;i<9;i++){ 8 if(n>=a[i]&&n<a[i+1]){ 9 puts(b[i]); 10 break; 11 } 12 } 13 } 14 return 0; 15 }
b 最少花费变成目标,枚举起点,计算花费
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char a[]="Sandro"; 6 char b[210]; 7 bool type(char c){ 8 return c>='a'&&c<='z'; 9 } 10 int val(char c){ 11 if(type(c)) return c-'a'; 12 return c-'A'; 13 } 14 int get(char a,char b){ 15 if(a==b) return 0; 16 if(type(a)==type(b)) return 5; 17 if(val(a)==val(b)) return 5; 18 return 10; 19 } 20 int main(){ 21 while(~scanf("%s",b)){ 22 int lb=strlen(b); 23 int ans=0x3f3f3f3f; 24 for(int i=0;i+5<lb;i++){ 25 int sum=0; 26 for(int j=0;j<6;j++){ 27 sum+=get(b[i+j],a[j]); 28 } 29 ans=min(ans,sum); 30 } 31 printf("%d\n",ans); 32 } 33 return 0; 34 }
c 每分钟来若干车 每分钟走k车,问最后剩多少,模拟
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main(){ 6 int k,n,x; 7 while(~scanf("%d%d",&k,&n)){ 8 int ans=0; 9 while(n--){ 10 scanf("%d",&x); 11 ans+=x; 12 if(ans>=k){ 13 ans-=k; 14 } 15 else{ 16 ans=0; 17 } 18 } 19 printf("%d\n",ans); 20 } 21 return 0; 22 }
d n男m女配对,使得烦恼值最小,排序后,贪心,枚举配对数,求最小值
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int M=123; 6 int a[M],b[M]; 7 bool cmp(const int &a,const int &b){ 8 return a>b; 9 } 10 int main(){ 11 int n,m; 12 while(~scanf("%d%d",&n,&m)){ 13 for(int i=0;i<n;i++){ 14 scanf("%d",&a[i]); 15 } 16 for(int i=0;i<m;i++){ 17 scanf("%d",&b[i]); 18 } 19 sort(a,a+n,cmp); 20 sort(b,b+m,cmp); 21 int ans=0x3f3f3f3f; 22 int sma=min(n,m); 23 for(int i=0;i<=sma;i++){ 24 int sum=0; 25 for(int j=i;j<n;j++){ 26 sum+=a[j]; 27 } 28 for(int j=i;j<m;j++){ 29 sum+=b[j]*i; 30 } 31 ans=min(ans,sum); 32 } 33 printf("%d\n",ans); 34 } 35 return 0; 36 }
e n个盒子,宝藏在其中一个盒子中,每次可以打开一个盒子查看,如果找到游戏结束,如果没有找到,关上盒子后宝藏会随机移动到相邻的左或右的盒子中,问如何顺序开盒子保证能找到
做法,从1开到n,若一开始宝藏在奇数号盒子中,则一定能找到,否则有可能恰好躲过。若躲过,说明一开始在偶数号,如果盒子总数是奇数,则经过n次后宝藏就在奇数号,再从1到n依次看就能找到,若总数是偶数,则盒子还在偶数号盒子中,那就开一次1号,使他移动到奇数号盒子,然后从头到尾开一次。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 vector<int> ans; 7 int main(){ 8 int n; 9 while(~scanf("%d",&n)){ 10 ans.clear(); 11 for(int i=1;i<=n;i++){ 12 ans.push_back(i); 13 } 14 if(n%2==0) ans.push_back(1); 15 for(int i=1;i<=n;i++){ 16 ans.push_back(i); 17 } 18 int la=ans.size(); 19 printf("%d\n",la); 20 for(int i=0;i<la;i++){ 21 if(i) printf(" "); 22 printf("%d",ans[i]); 23 } 24 puts(""); 25 } 26 return 0; 27 }
H 要满足图中3个的交集的值要是3个集合权值之和模2,只能换一位或者不换,暴力找
1 #include<cstdio> 2 int a[8]; 3 bool judge(){ 4 return a[6]==a[0]^a[1]^a[3]&&a[5]==a[0]^a[2]^a[3]&&a[4]==a[1]^a[2]^a[3]; 5 } 6 void out(){ 7 for(int i=0;i<7;i++){ 8 printf("%d%c",a[i],i==6?'\n':' '); 9 } 10 } 11 int main(){ 12 while(~scanf("%d",&a[0])){ 13 for(int i=1;i<7;i++){ 14 scanf("%d",&a[i]); 15 } 16 if(judge()){ 17 out(); 18 continue; 19 } 20 for(int i=0;i<7;i++){ 21 a[i]^=1; 22 if(judge()){ 23 out(); 24 break; 25 } 26 a[i]^=1; 27 } 28 } 29 return 0; 30 }
i 两个高度一样的圆台,上圆大下圆小,放入一个矩形托盘中,问是否能放下,如果碗比托盘矮,等价于两个圆放入矩形中,如果碗比较高,通过比例算出与托盘等高的圆的半径,然后圆心对角放,算一下圆心距,要大于等于上面圆半径之和即可。
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 struct point{ 6 double x,y; 7 }A,B; 8 double Distance2(point a,point b){ 9 return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 10 } 11 void yes(){ 12 puts("YES"); 13 } 14 void no(){ 15 puts("NO"); 16 } 17 int main(){ 18 double a,b,d,Ar,AR,Br,BR,h,Ax,Bx; 19 while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&d,&Ar,&AR,&Br,&BR,&h)){ 20 if(a<b) swap(a,b); 21 Ax=AR; 22 Bx=BR; 23 if(h>d){ 24 Ax=d*(AR-Ar)/h+Ar; 25 Bx=d*(BR-Br)/h+Br; 26 } 27 if(Ax<Bx) swap(Ax,Bx); 28 if(Ax*2>b){ 29 no(); 30 continue; 31 } 32 A.x=Ax; 33 A.y=Ax; 34 B.x=a-Bx; 35 B.y=b-Bx; 36 if(Distance2(A,B)>=(AR+BR)*(AR+BR)){ 37 yes(); 38 } 39 else{ 40 no(); 41 } 42 } 43 return 0; 44 }
j 已知所有人围成一圈,确定起点以后依次顺时针出场,输入每个人想第几个出场,问谁第一个出场满足最多人的需求,
知道某个人想第几个出场,往前算就知道谁第一个出场能满足她,那么统计一下,最后就知道每个人作为第一个能满足几个。
1 #include<cstdio> 2 const int M=1e5+10; 3 int a[M],cnt[M]; 4 int main(){ 5 int n; 6 while(~scanf("%d",&n)){ 7 for(int i=1;i<=n;i++){ 8 scanf("%d",&a[i]); 9 cnt[i]=0; 10 } 11 for(int i=1;i<=n;i++){ 12 int now=a[i]; 13 if(i>=now){ 14 cnt[i-now+1]++; 15 continue; 16 } 17 cnt[n-(now-i)+1]++; 18 } 19 int ans=1; 20 for(int i=1;i<=n;i++){ 21 if(cnt[ans]<cnt[i]){ 22 ans=i; 23 } 24 } 25 printf("%d\n",ans); 26 } 27 return 0; 28 }
k n人排队,每人买一种东西若干个,若商店没有了,这个人走,花一分钟;若商店东西足够他需求,买了走,商店这种产品减去他买的个数,花一分钟;若商品不够,记录一下剩多少,和排第二的人换一下位子,如果已经记录过,则看上次记录的值和当前剩的值是否相同,若相同将剩的全买走,若不同则记录一下当前剩的值,然后再和第二个人换位子。
数组模拟n个人排队。
1 #include<cstdio> 2 #include<iostream> 3 #include<map> 4 using namespace std; 5 const int M=1024; 6 struct G{ 7 string s; 8 int c,p; 9 }g[M]; 10 char a[16],b[16]; 11 map<string,int> mp; 12 int main(){ 13 int n,m,cnt; 14 while(~scanf("%d",&m)){ 15 mp.clear(); 16 while(m--){ 17 scanf("%d%s%s",&cnt,a,b); 18 mp[(string)b]=cnt; 19 } 20 scanf("%d",&n); 21 for(int i=0;i<n;i++){ 22 scanf("%d%s%s",&cnt,a,b); 23 g[i].c=cnt; 24 g[i].s=(string)b; 25 g[i].p=-1; 26 } 27 int ans=0; 28 for(int i=0;i<n;i++,ans++){ 29 if(!mp[g[i].s]){ 30 continue; 31 } 32 int shop=mp[g[i].s]; 33 if(shop>=g[i].c){ 34 mp[g[i].s]-=g[i].c; 35 continue; 36 } 37 if(shop==g[i].p){ 38 mp.erase(g[i].s); 39 continue; 40 } 41 if(i==n-1) continue; 42 g[i].p=shop; 43 swap(g[i],g[i+1]); 44 i--; 45 } 46 printf("%d\n",ans); 47 } 48 return 0; 49 }
L 给出每种面值一开始的张数,给票的单价,现在问少了一张票以后,原来能买的张数现在不能买了,输出这些张数。贪心选面值最小的。
1 #include<cstdio> 2 int a[]={10,50,100,500,1000,5000}; 3 int b[8]; 4 int main(){ 5 int n; 6 while(~scanf("%d",&b[0])){ 7 for(int i=1;i<6;i++){ 8 scanf("%d",&b[i]); 9 } 10 scanf("%d",&n); 11 int big=0,sma=0; 12 bool flag=false; 13 for(int i=0;i<6;i++){ 14 big+=a[i]*b[i]; 15 if(!flag&&b[i]){ 16 flag=true; 17 sma+=(b[i]-1)*a[i]; 18 continue; 19 } 20 sma+=a[i]*b[i]; 21 } 22 big/=n; 23 sma=sma/n+1; 24 printf("%d\n",big-sma+1); 25 for(int i=sma;i<=big;i++){ 26 if(i>sma) printf(" "); 27 printf("%d",i); 28 } 29 puts(""); 30 } 31 return 0; 32 }
end