(2022牛客多校五)签到题H&B+(杭电多校五)签到题1010

115 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

B-Watches(二分)

image.png

样例输入:

4 5
3 4 5 6

样例输出:

1

题意:给定n件商品的价格,如果你选购第k件商品,那么购买第i件物品的花费就是ai+k*i,问m元最多能买多少件(第i件是原序列中的第i个)

分析:我们容易发现的一点是答案具有单调性,我能买k件物品,那么我就一定能买k-1件商品,这是显然的,所以我们就可以对商品进行排序,对于每次二分的k我们都需要按照ai+k*i按照从小到大进行排序,然后从前往后贪心地选取即可,看用m元最多能买多少件商品,如果大于k返回true,否则返回false。

下面是代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
struct node{
	int id,v;
}p[N];
int mid,n,m;
bool cmp(node a,node b)
{
	return a.v+a.id*mid<b.v+b.id*mid;
}
bool check(int k)
{
	long long ans=0;
	sort(p+1,p+n+1,cmp);
	for(int i=1;i<=k;i++)
		ans+=p[i].v+1ll*p[i].id*k;
	return ans<=m;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d",&p[i].v),p[i].id=i;
	int l=0,r=n;
	while(l<r)
	{
		mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	printf("%d",l);
	return 0;
}

H-Cutting Papers

image.png

样例输入: 

2022

样例输出:

3649785.912339927

题意:求|x|+|y|+|x+y|<=n所在的区域和xx+yy=(n/2)*(n/2)所在区域的面积并。

这道题就是一个签到题,图如下:

image.png

直接用圆的面积加上2*(小正方形面积-1/4圆面积)即可。

下面是代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
#define pi acos(-1)
const int N=1e4+10;
int main()
{
	long double n;
	while(scanf("%Lf",&n)!=EOF)
	{
		long double ans=n/4*n*pi;
		ans+=(n*n/4-n/4*n*pi/4)*2;
		printf("%.10Lf\n",ans);
	}
	return 0;
}

杭电多校五 1010-Bragging Dice (思维)

image.png image.png image.png

样例输入: 

1
5
4 6 4 1 2
3 6 6 2 3

样例输出:

Win!

分析:这道题其实卡了挺久的,因为我一开始就感觉直接输出Win!即可,但是不知道为什么一直wa,因为我当时想的是既然双方都知道骰子是什么情况,那么我就直接说出一个正确的且对方无法claim的方案,那么先手就稳胜了,这样的方案一定是存在的,因为比如我现在随便说出一种方案,那么如果存在一种方案可以claim,那么我就直接输出claim的那种方案,直到不能claim为止,现在这是可行的,但是没注意到的一点是claim的点数必须是大于0的,但是题目中说了如果所有一个杯中所有点数都是不同的,那么我就认为没有点数,所以有可能一开始两个杯子每个杯中的骰子点数都是不同的,但是先手无法说0,那么先手就输了,除此之外的任何一种情况都是先手必胜的。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e4+10;
int vis[10];
int main()
{
	int T;
	cin>>T;
	int n;
	while(T--)
	{
		bool flag=false;
		for(int i=1;i<=6;i++) vis[i]=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			int t;
			scanf("%d",&t);
			if(vis[t]) flag=true;
			vis[t]++;
		}
		for(int i=1;i<=6;i++) vis[i]=0;
		for(int i=1;i<=n;i++)
		{
			int t;
			scanf("%d",&t);
			if(vis[t]) flag=true;
			vis[t]++;
		}
		if(flag) puts("Win!");
		else puts("Just a game of chance.");
	}
	return 0;
}