AtCoder Beginner Contest 354

 A

模拟

n=int(input())

x=1
d=1
i=2
while x<=n:
    d+=1
    x+=i
    i*=2
print(d)
    

B

排序

#include<bits/stdc++.h>

using namespace std;
string str[110];
int main()
{
	int n;
	cin>>n;
	int x=0;
	for(int i=0;i<n;i++)
	{
		string s;
		int w;
		cin>>s>>w;
		x+=w;
		str[i]=s;
	}
	
	sort(str,str+n);
	cout<<str[x%n]<<endl;
	return 0;
 } 

C

自定义排序

按照A排序,再从后往前砍掉逆序的C

#include<bits/stdc++.h>

using namespace std;
int n;
const int N = 2e5 + 10;
struct node{
	int idx;
	int A;
	int C;
}a[N]; 
bool cmd(node x,node y)
{
	return x.A<y.A;
}
bool cmd1(node x,node y)
{
	return x.idx<y.idx;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int g,h;
		cin>>g>>h;
		a[i].idx=i;
		a[i].A=g;
		a[i].C=h;
	}	
	sort(a+1,a+n+1,cmd);
	int res=0;

	int minx=a[n].C;
	for(int i=n-1;i>=1;i--)
	{
		if(a[i].C>minx) 
		{
			a[i].idx=0;	
			res++;
		}
		else
		{
			minx=min(minx,a[i].C);
		}
	}
	sort(a+1,a+n+1,cmd1);
	
	cout<<n-res<<endl;
	
	for(int i=1;i<=n;i++)
	{
		if(a[i].idx!=0) cout<<a[i].idx<<" ";
	}
	cout<<endl;
	return 0;
 } 

D

计算面积

需要计算4部分

X*Y:先计算完整的4*2矩阵

MY*X:如果y余下一行(MY那一行),再计算余下的一行,x*4(这里的x是除以4得到的整数)

MX*Y:因为是有规律的矩形,所以不需要考虑是否题目要求的面积的边界不是规律矩形的边界

                即可以从右往左依次计算多余的mx,最后乘以y

MX*MY:如果存在MY,那么他就只是一行,所以计算mx时候,可以直接计算

需要注意取模4的结果,来建立二维数组

#include<bits/stdc++.h>

using namespace std;
int q[5][2]={{1,0},{2,1},{1,2},{0,1}};
//int q[5][2]={{2,1},{1,2},{0,1},{1,0}};
const int M = 1e9;
#define int long long
signed main()
{
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	a+=M;
	b+=M;
	c+=M;
	d+=M;
//	cout<<q[0][0]<<" "<<q[0][1]<<endl;	
//	cout<<q[1][0]<<" "<<q[1][1]<<endl;	
//	cout<<q[2][0]<<" "<<q[2][1]<<endl;	
//	cout<<q[3][0]<<" "<<q[3][1]<<endl;		
	int x=(c-a)/4,mx=(c-a)%4;
	int y=(d-b)/2,my=(d-b)%2;
//	cout<<x<<" "<<my<<endl;
	int s=x*y*8;
	if(my==1)	s+=4*x;
	int ns=0;
	for(int i=0,j=c;i<mx;i++,j--)
	{
		ns+=q[j%4][0]+q[j%4][1];
		
		if(my==1)	
		{
			s+=q[j%4][b%2==0 ? 0 : 1];
//			cout<<s<<endl;
		}
			
	}
//	cout<<s<<endl;
	s+=ns*y;
	cout<<s<<endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值