Codeforces Round #549 (Div. 2) ABCD 题解

题目链接

A. The Doors

分析

水题,题目要找的是一段序列的最后一个0或1的下标中小的那个,直接记录后输出小的就行了.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set> 
13 const int INF=0x3f3f3f3f;
14 using namespace std;
15 
16 int main()
17 {
18 //    freopen("in.txt","r",stdin);
19 //    freopen("out.txt","w",stdout);
20     int a=0,b=0,n;
21     cin>>n;
22     for(int i=0;i<n;i++)
23     {
24         int x;scanf("%d",&x);
25         if(x==0) a=i+1;
26         if(x==1) b=i+1;
27     }
28     int ans=min(a,b);
29     cout<<ans<<endl;
30     return 0;
31 }
View Code

 

B. Nirvana

分析

随便举例一个数分析一下,设x=1895462,按题意只需从1*8*9*5*4*6*2,1*8*9*5*4*(6-1)*9,1*8*9*5*(3-1)*9*9,1*8*9*(4-1)*9*9*9,1*8*(9-1)*9*9*9*9,1*(8-1)*9*9*9*9*9,9*9*9*9*9*9中找最大值即可,这里需要注意的是最后一位1-1=0的时候,就不需要*0了,还有如果是第i位(不是最后以为)且num[i]-1<=0,num[i]表示第几位数,则可以跳过这一步.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set> 
13 const int INF=0x3f3f3f3f;
14 using namespace std;
15 
16 int num[20];
17 
18 int main()
19 {
20 //    freopen("in.txt","r",stdin);
21 //    freopen("out.txt","w",stdout);
22     long long n;
23     cin>>n;
24     long long k=n;
25     int cnt=0;
26     while(k)
27     {
28         num[cnt++]=k%10;
29         k/=10;
30     }
31     long long ans=0;
32     for(int i=0;i<cnt;i++)
33     {
34         long long sum=1;
35         if(i)
36         {
37             if(num[i]-1<=0&&i!=cnt-1) continue;
38             if(num[i]-1<=0&&i==cnt-1) cnt--;
39             num[i]-=1;
40             for(int j=0;j<i;j++) num[j]=9;
41         }
42         for(int j=0;j<cnt;j++) sum*=num[j];
43         ans=max(sum,ans);
44     }
45     cout<<ans<<endl;
46     return 0;
47 }
View Code

 

C. Queen

分析

这道题需要查找出本节点c值1是且儿子节点全都是1的节点,把树的边存起来,用dfs进行搜索就行.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set> 
13 using namespace std;
14 const int INF=0x3f3f3f3f;
15 
16 vector<int> v[100001]; //装边 
17 int c[100001]; 
18 int ans[100000]; //用来装要删的数 
19 int cnt=0; //用来控制ans数组 
20 
21 int dfs(int x)
22 {
23     int s=1;
24     for(int i=0;i<v[x].size();i++)
25     {
26         if(!dfs(v[x][i])) s=0;
27     }
28     if(c[x]&&s) ans[cnt++]=x;
29     return c[x];  
30 }
31 
32 int main()
33 {
34 //    freopen("in.txt","r",stdin);
35 //    freopen("out.txt","w",stdout);
36     int n;
37     cin>>n;
38     int s; //记录树根 
39     for(int i=1;i<=n;i++)
40     {
41         int x;scanf("%d%d",&x,&c[i]);
42         if(x==-1)
43         {
44             s=i;
45             continue;
46         }
47         else v[x].push_back(i);
48     }
49 /*    for(int i=1;i<=n;i++)
50     {
51         printf("%d:",i);
52         for(int j=0;j<v[i].size();j++)
53         printf("%d ",v[i][j]);
54         cout<<"------"<<c[i];
55         cout<<endl;
56     }
57 */    dfs(s);
58     if(cnt)
59     {
60         sort(ans,ans+cnt);
61         for(int i=0;i<cnt-1;i++)
62         printf("%d ",ans[i]);
63         printf("%d\n",ans[cnt-1]);
64     }
65     else cout<<-1<<endl;
66     return 0;
67 }
View Code

 

D. The Beatles

分析

假已经知道每次走l km,则到达s起点需要的步数为n*k/(gcd(n*k,l)),设l=k*x+c,当给定a,b时,c只有两种可能(a+b),|a-b|,举个例子,这里假设a=4,b=2,k=8,1代表s,2代表第一走l步后的位置,-1代表餐馆,

1 0 2 0 -1 0 2 0 1,看看1和2的距离就知道了.需要注意的是数据记得开long long,不然计算步数是会溢出.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set> 
13 const long long INF=0x3f3f3f3f3f3f3f3f;
14 using namespace std;
15 
16 long long gcd(long long a,long long b)
17 {
18     return b?gcd(b,a%b):a;
19 }
20 
21 int main()
22 {
23 //    freopen("in.txt","r",stdin);
24 //    freopen("out.txt","w",stdout);
25     long long n,k,a,b;
26     cin>>n>>k>>a>>b;
27     long long minn=INF,maxn=0;
28     for(int i=0;i<n;i++)
29     {
30         long long l=i*k+a+b;
31         long long res=n*k/(gcd(n*k,l));
32         minn=min(minn,res),maxn=max(maxn,res);
33         long long s=a-b;
34         if(s<0) s*=-1;
35         l=i*k+s;
36         res=n*k/(gcd(n*k,l));
37         minn=min(minn,res),maxn=max(maxn,res);
38     }
39     cout<<minn<<' '<<maxn<<endl;
40     return 0;
41 }
View Code

 

转载于:https://www.cnblogs.com/VBEL/p/10643493.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值