ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 190

2021-01-31 09:01:50  阅读:171  来源: 互联网

标签:AtCoder Beginner int ll namespace 190 long include 移位


A:

Takahashi和Aoki分别有A和B颗糖果,两人轮流吃一个,若C为0则Takahashi先吃,C为1则Aoki先吃,先吃完的为输。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <map>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <cmath>
11 typedef long long ll;
12 const int INF=0x3f3f3f3f;
13 using namespace std;
14 int a,b,c;
15 int main(void)
16 {
17     cin>>a>>b>>c;
18     if(c==0)
19     {
20         if(a>b)cout<<"Takahashi"<<endl;
21         else cout<<"Aoki"<<endl;
22     }
23     else
24     {
25         if(a<b)cout<<"Aoki"<<endl;
26         else cout<<"Takahashi"<<endl;
27     }
28     return 0;
29 }

B:

Takahashi有N段符咒,每段需要吟唱Xi秒,伤害为Yi,而怪兽能免疫吟唱时间在S秒及以上和伤害在D及以下的符咒,问能否对怪兽造成伤害。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <map>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <cmath>
11 typedef long long ll;
12 const int INF=0x3f3f3f3f;
13 using namespace std;
14 int n,s,d;
15 int main(void)
16 {
17     cin>>n>>s>>d;
18     while(n--)
19     {
20         int x,y;
21         cin>>x>>y;
22         if(x>=s||y<=d)continue;
23         cout<<"Yes"<<endl;
24         return 0;
25     }
26     cout<<"No"<<endl;
27     return 0;
28 }

C:

有N个盘子和M个状态,第i个状态满足当且仅当第Ai和第Bi个盘子上有一个以上的球。有K个人,每个人可以把一个球放在第Ci或者第Di个盘子上。求能满足的最多状态数。

分析:由于K<=16,那么总的情况数只有216种,因此可以直接暴搜,每次更新答案即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <map>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <cmath>
11 typedef long long ll;
12 const int INF=0x3f3f3f3f;
13 using namespace std;
14 int n,m,a[1000][2],b[1100],c[1000][2],k,ans;
15 void dfs(int t)
16 {
17     if(t==k+1)
18     {
19         int cnt=0;
20         for(int i=1;i<=m;++i)
21         {
22             if(b[a[i][0]]&&b[a[i][1]])cnt++;
23         }
24         ans=max(cnt,ans);
25     }
26     else
27     {
28         b[c[t][0]]++;
29         dfs(t+1);
30         b[c[t][0]]--;
31         b[c[t][1]]++;
32         dfs(t+1);
33         b[c[t][1]]--;
34     }
35 }
36 int main(void)
37 {
38     cin>>n>>m;
39     for(int i=1;i<=m;++i)
40     {
41         cin>>a[i][0]>>a[i][1];
42     }
43     cin>>k;
44     for(int i=1;i<=k;++i)
45     {
46         cin>>c[i][0]>>c[i][1];
47     }
48     dfs(1);
49     cout<<ans<<endl;
50     return 0;
51 }

D:

给定一个整数N,求有多少个公差为1的等差数列,使得数列和为N。

分析:我们只需考虑数列为正整数的情况,然后乘2即可。因为对于任意一个满足条件的正整数数列a1,a2,……,an,都可以在前面添加一个首项为-a1+1,末项为a1-1的等差数列,使得和仍为N。假设项数为i,那么有(1+i)*i<=2*N。我们枚举每个项数,判断是否合法。

(1)若i为奇数,仅需判断N是否整除i。

(2)若i为偶数:如果N为奇数,那么i不能为4的倍数;如果N为偶数,那么i应为4的倍数。同时对任意N,还要满足N整除i/2,而且N/(i/2)为奇数。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <map>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <cmath>
11 #include <set>
12 #include <unordered_set>
13 typedef long long ll;
14 const int INF=0x3f3f3f3f;
15 using namespace std;
16 ll n,ans;
17 int main(void)
18 {
19     cin>>n;
20     for(ll i=1;i*i+i<=2*n;++i)
21     {
22         if(i&1)
23         {
24             if(n%i==0)ans+=2;
25         }
26         else
27         {
28             if(n%2==1&&i%4!=0&&n%(i/2)==0&&(n/(i/2))%2==1||n%2==0&&i%4==0&&n%(i/2)==0&&(n/(i/2))%2==1)ans+=2;
29         }
30     }
31     cout<<ans<<endl;
32     return 0;
33 }

 

E:

待补。

 

F:

给出0到N-1的一组排列,将排列向左移位k次,k=0,1,……,N-1,求每次移位后的排列的逆序对数。

分析:我们先算出刚开始的排列的逆序对数x0。每次移位相当于把第一个数放到末尾。对于第i次移位,假设第i-1次移位后的逆序对数为x,第一个数为a0,那么我们只需减去在第i-1次移位中a0的贡献P1,再加上在第i次移位中a0的贡献P2即可。由于这是0到N-1的排列,可以知道P1=a0(所有比他小的数),P2=N-1-a0(所有比他大的数)。因此通过循环更新x0即可。

关于求逆序对,可以看一下这道题:https://www.luogu.com.cn/problem/P1908

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <map>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <cmath>
11 #include <set>
12 typedef long long ll;
13 const int INF=0x3f3f3f3f;
14 using namespace std;
15 int a[310000],b[310000],c[310000],n;
16 ll ans;
17 void msort(int h,int r)
18 {
19     if(h==r)return;
20     int mid=(h+r)/2,i=h,j=mid+1,k=h;
21     msort(h,mid);
22     msort(mid+1,r);
23     while(i<=mid&&j<=r)
24     {
25         if(a[i]<=a[j])
26         {
27             c[k++]=a[i++];
28         }
29         else
30         {
31             c[k++]=a[j++];
32             ans+=mid-i+1;
33         }
34     }
35     while(i<=mid)c[k++]=a[i++];
36     while(j<=r)c[k++]=a[j++];
37     for(int i=h;i<=r;++i)a[i]=c[i];
38 }
39 int main(void)
40 {
41     scanf("%d",&n);
42     for(int i=1;i<=n;++i)
43     {
44         scanf("%d",&a[i]);
45         b[i]=a[i];
46     }
47     msort(1,n);
48     cout<<ans<<endl;
49     for(int i=1;i<n;++i)
50     {
51         ans-=b[i];
52         ans+=n-1-b[i];
53         cout<<ans<<endl;
54     }
55     return 0;
56 }

 

标签:AtCoder,Beginner,int,ll,namespace,190,long,include,移位
来源: https://www.cnblogs.com/yanying7/p/14351366.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有