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 }
View Code

 

 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 }
View Code

 

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 }
View Code

 

 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 }
View Code

 

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 }
View Code

 

 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 }
View Code

 

 

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 }
View Code

 

 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 }
View Code

 

 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 }
View Code

 

 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 }
View Code

 

 

end

posted on 2015-04-04 22:43  gaolzzxin  阅读(232)  评论(0编辑  收藏  举报