Atcoder abc250 题解 (A~G)

A . Adjacent Squares (枚举)

枚举一下,满足题意则ans++即可

cin>>h>>w;
    cin>>r>>c;
    int ans=0;
    for(int i=1;i<=h;++i)
      for(int j=1;j<=w;++j)
        {
        	if(abs(i-r)+abs(j-c)==1)
        	  ++ans;
        }
    cout<<ans;

B . Enlarged Checker Board (模拟)

模拟输出便可,注意循环的正确性。

cin>>n>>a>>b;
    t=n;
    flag=1;
    while(t--)
      {
      	for(int k=1;k<=a;++k)
      	{
      	 for(int i=1;i<=n;++i)
           for(int j=1;j<=b;++j)
             {
             	if(flag)
             	  {
             	  	if(i&1)
             	  	  printf(".");
                    else
                     printf("#");
             	  }
             	else
             	  {
             	  	if(!(i&1))
             	  	  printf(".");
                    else
                      printf("#");
             	  }   	 
             }
             printf("\n");
             }
        flag^=1;
      }

C . Adjacent Swaps (模拟)

题意:每次操作给出一个数字,找到数字位置,将其和右边的数交换,如果是在最右边,则与左边的交换。

使用两个数组,一个数组a下标是位置,表示该位置目前的数字,另一个数组p下表是数字,表示该数字目前所处的位置。每次操作都维护这两个数组即可。

#include<bits/stdc++.h>
#define ll long long
const int N=1e6+5;
//const int N=1e5+5;
//const int mod=1e9+7;
//const long long mod=998244353;
using namespace std;

int n,t;

int a[N],x;
int p[N];
int p1,x1;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    iota(a,a+n+1,0);
    iota(p,p+n+1,0);
    cin>>t;
    while(t--)
      {
      	cin>>x;
      	if(p[x]==n)
      	  {
      	  	p1=p[x];
      	  	x1=a[p[x]-1];
      	  	 swap(a[p[x]],a[p[x]-1]);
      	  	 p[x1]=p1;
      	  	 p[x]=p[x]-1;
      	  }
      	else
      	  {
      	  	p1=p[x];
      	  	x1=a[p[x]+1];
      	  	 swap(a[p[x]],a[p[x]+1]);
      	  	 p[x1]=p1;
      	  	 p[x]=p[x]+1;
      	  }
      }
    for(int i=1;i<=n;++i)
      printf("%d ",a[i]);
}

D . 250-like Number (质数筛,枚举)

题意:二百五数是 $ p * q^3$ 其中p , q是质数且 p < q p < q p<q,对给出的N( 1 < = N < = 1 e 18 1<=N<=1e18 1<=N<=1e18),求有多少个二百五数。(这个二百五应该是因为纪念abc250哈哈哈)

我们先用线性筛筛出一定范围内的质数,因为N的范围很大,所以我们也尽量筛多一点,最后我们枚举出$ p * q^3$的值,因为这个值有可能溢出,我们可以将质数之一移向右边。

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
//const int N=1e6+5;
//const int N=1e5+5;
//const int mod=1e9+7;
//const long long mod=998244353;
using namespace std;
ull prime[20000005];
int cnt;
bool isprime[20000005];
void shai(ull x)
{
	for(int i=2;i<=x;i++)
	  {
	  	if(isprime[i])
	  	  prime[++cnt]=i;
	  	for(int j=1;j<=cnt,i*prime[j]<=x;j++)
	  	  {
	  	  	isprime[i*prime[j]]=0;
	  	  	if(i%prime[j]==0)
	  	  	  break;
	  	  }
	  }
}

ull n,t;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ull sum=0;
    memset(isprime,1,sizeof(isprime));
    shai((ull)20000000);
    cin>>n;
    for(int i=1;i<=cnt;++i)
      for(int j=i+1;j<=cnt;++j)
        {
        	if(prime[i]*prime[j]*prime[j]>(n/prime[j]))
        	  break;
          ++sum;
        }
    printf("%lld\n",sum);
}

E . Prefix Equality (哈希)

题意:给出两段整数序列a,b,接着是q次询问,询问给出两个整数x,y,问a的前x位数字和b的前y位数字种类是否完全相同。

思路: 注意到这道题是问前若干位的数字种类相同,因此遍历一遍数列,如果出现了新的数,则计算其哈希值加入其中,若已经出现过了,就不需要加入了,以此来去除重复数字对序列种类哈希值的影响,最后在询问中查询是否相等即可。

#include<bits/stdc++.h>
#define ll long long
//const int N=1e6+5;
const int N=2e5+5;
//const int mod=1e9+7;
//const long long mod=998244353;
using namespace std;

int n,t;

set<int>s1,s2;
unsigned int h1[N],h2[N];
int r=1e9+7;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int x,y;
    cin>>n;
    for(int i=1;i<=n;++i)
      {
      	cin>>x;
      	if(!s1.count(x))
      	  h1[i]=h1[i-1]+x*(x+r);
      	else  
      	  h1[i]=h1[i-1];
      	s1.insert(x);
      }
    for(int i=1;i<=n;++i)
      {
      	cin>>x;
      	if(!s2.count(x))
      	  h2[i]=h2[i-1]+x*(x+r);
      	else  
      	  h2[i]=h2[i-1];
      	s2.insert(x);
      }
    cin>>t;
    while(t--)
      {
      	cin>>x>>y;
      	if(h1[x]==h2[y])
      	  printf("Yes\n");
      	else
      	  printf("No\n");
      }
}

F . One Fourth (计算几何)

官方题解利用滑动窗口优化到了 O ( N ) O(N) O(N), 大概意思是说先选取第二个点作为q,然后对 p = 1 , 2 , 3.. N p=1,2,3..N p=1,2,3..N进行遍历,计算吃的 p , q , q + 1 p,q,q+1 p,q,q+1面积,如果吃的面积 E < S / 4 E<S/4 E<S/4,使q上升,在循环结束时移除 p , p + 1 , q p,p+1,q p,p+1,q即可。而不需要重新从 q = 2 q=2 q=2开始,因为可以证明这样不会使结果更优。

官方sample code

#include<bits/stdc++.h>
#define ll long long

using namespace std;

struct Point 
{
	ll px,py;
};

Point operator+(const Point& a1,const Point& a2) 
{
	return Point{a1.px+a2.px,a1.py+a2.py};
}

Point operator-(const Point& a1,const Point& a2) 
{
	return Point{a1.px-a2.px,a1.py-a2.py};
}

bool operator<(const Point& a1, const Point& a2) 
{
	if (a1.px<a2.px) return true;
	if (a1.px>a2.px) return false;
	if (a1.py<a2.py) return true;
	return false;
}

ll crs(Point p1,Point p2) 
{
	return p1.px*p2.py-p1.py*p2.px;
}

int main()
{
    int n;
    cin>>n;
    vector<Point>pts(n);
    for(int i=0;i<n;i++)
      cin>>pts[i].px>>pts[i].py;
    ll s=0;
    for(int i=2;i<n;i++)
      s+=abs(crs(pts[i-1]-pts[0],pts[i]-pts[0]));
    ll res=8e18,e=0;
    int q=1;
    for(int p=0;p<n;p++)
      {
        while(4*e<s)
          {
            e+=abs(crs(pts[q]-pts[p],pts[(q+1)%n]-pts[p]));
            q++;
            q%=n;
            res=min(res,abs(4*e-s));
          }
       e-=abs(crs(pts[p]-pts[q],pts[(p+1)%n]-pts[q]));
       res=min(res,abs(4*e-s));
     }
  cout<<res<<'\n';
}

G . Stonks(反悔贪心)

全新股票买卖,现已加入股票买卖豪华午餐。

我们在遇到比目前最低价格高的股票时就进行买入卖出操作,这是贪心。但是如果后来又来了一个更高价格的呢,我们就买入此时卖出的,达到反悔的效果。也就是比如说,对于 p < q < r p<q<r p<q<r我以p的价格买入,后来q的价格贪心卖出,那么我接着以q的价格买入, 再以r的价格卖出。 这一连串的操作, 其实相当以p的价格买入,以r的价格卖出。我们用优先队列实现这一操作。

#include<bits/stdc++.h>
#define ll long long
//const int N=1e6+5;
//const int N=1e5+5;
//const int mod=1e9+7;
//const long long mod=998244353;
using namespace std;

int n,t;

ll ans,x;

priority_queue<ll,vector<ll>,greater<ll>>q;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    ans=0;
    for(int i=1;i<=n;++i)
      {
      	 cin>>x;
      	 if(!q.empty()&&q.top()<x)
      	   {
      	   	ans+=x-q.top();
      	   	q.pop();
      	   	q.push(x);
      	   }
      	q.push(x);
      }
    printf("%lld\n",ans);
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
广东ABC公司期权激励计划 为了进一步完善公司治理结构,健全公司激励机制,增强公司管理团队和业务骨干或其他人员对实现公司持续、健康发展的责任感、使命感,确保公司发展目标的实现,广东ABC公司(“本公司”或“公司”)根据有关法律法规及公司章程的规定,本公司特制定如下期权激励计划(“本计划”),经公司董事和全体股东审议批准后方可实施。 1.激励股权 1.1.现有公司股权结构。本公司为一家依据中华人民共和国(“中国”)法律在注册成立的有限公司,注册资本为5,000,000.00人民币,现有股东(“现有股东”)2位,具体信息如下: 现有股东姓名或名称 认缴注册资本人民币 占股比例(%) 1 张三 3,500,000.00 70.00% 2 李四 1,500,000.00 30.00% 总计 5,000,000.00 100.00% 1.2.激励股权的数额。本公司现有股东一致同意,拟根据本计划,通过现有股东转让的方式,留出本公司750,000.00人民币注册资本,即公司15.00%的股权比例(“激励股权”)用于本公司的激励计划,授予本公司指定的董事、监事、高级管理人员、员工或其他人员(“合格人员”)按约定时间和步骤直接或间接取得激励股权的权利(“期权”),以激励对本公司的经营发展做出突出贡献的并持续服务于本公司的合格人员。激励股权和期权占本公司的相应股权比例可能因公司后续融资而相应稀释,相应的注册资本也可能因为本公司注册资本的变化(如公司资本公积转增股本或公司后续融资)而变化,届时均根据变化情况相应调整。 1.3.激励股权的预留。本公司现有股东同意,激励股权由现有(创始)股东的股权中预留。现有股东分别让出的份额如下: 现有股东姓名或名称 出让注册资本人民币 占股比例(%) 张三 500,000.00 10.00% 李四 250,000.00 5.00% 总计 750,000.00 15.00% 1.4.虚拟股份。为便于操作激励股权的授予,本公司决定将激励股权分解为壹亿(100,000,000)个虚拟单位。根据本计划可发行的激励股权最大总数为壹亿(100,000,000)个虚拟单位。 可执行的激励股权。若任何授予的期权到期失效、丧失行使权力、被取消或由于其他原因在完全或部分行使前终止,则该期权未行使部分所对应的激励股权不计算在本计划第1.4条规定的最大总数内,可以继续用作本计划下未来的期权授予。合格人员行使期权并依据本
AtCoder Beginner Contest 134 是一场 AtCoder 的入门级比赛,以下是每道题的简要题解: A - Dodecagon 题目描述:已知一个正十二边形的边长,求它的面积。 解题思路:正十二边形的内角为 $150^\circ$,因此可以将正十二边形拆分为 12 个等腰三角形,通过三角形面积公式计算面积即可。 B - Golden Apple 题目描述:有 $N$ 个苹果和 $D$ 个盘子,每个盘子最多可以装下 $2D+1$ 个苹果,求最少需要多少个盘子才能装下所有的苹果。 解题思路:每个盘子最多可以装下 $2D+1$ 个苹果,因此可以将苹果平均分配到每个盘子中,可以得到最少需要 $\lceil \frac{N}{2D+1} \rceil$ 个盘子。 C - Exception Handling 题目描述:给定一个长度为 $N$ 的整数序列 $a$,求除了第 $i$ 个数以外的最大值。 解题思路:可以使用两个变量 $m_1$ 和 $m_2$ 分别记录最大值和次大值。遍历整个序列,当当前数不是第 $i$ 个数时,更新最大值和次大值。因此,最后的结果应该是 $m_1$ 或 $m_2$ 中较小的一个。 D - Preparing Boxes 题目描述:有 $N$ 个盒子和 $M$ 个物品,第 $i$ 个盒子可以放入 $a_i$ 个物品,每个物品只能放在一个盒子中。现在需要将所有的物品放入盒子中,每次操作可以将一个盒子内的物品全部取出并分配到其他盒子中,求最少需要多少次操作才能完成任务。 解题思路:首先可以计算出所有盒子中物品的总数 $S$,然后判断是否存在一个盒子的物品数量大于 $\lceil \frac{S}{2} \rceil$,如果存在,则无法完成任务。否则,可以用贪心的思想,每次从物品数量最多的盒子中取出一个物品,放入物品数量最少的盒子中。因为每次操作都会使得物品数量最多的盒子的物品数量减少,而物品数量最少的盒子的物品数量不变或增加,因此这种贪心策略可以保证最少需要的操作次数最小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值