signed

QiShunwang

“诚信为本、客户至上”

牛客小白月赛32(部分)

2021/3/20 22:29:20   来源:

A 拼三角

题目描述
给出6根棍子,能否在选出3根拼成一个三角形的同时剩下的3根也能组成一个三角形?
输入描述:
首先在一行中给出一个 t,1 \le t \le 10^3t,1≤t≤10
3
,代表测试数据的组数

接下来t行,每行给出6个数字代表棍子长度,棍子长度为正且小于10^910
9

输出描述:
在一行中输出 “Yes” or “No”
示例1
输入
复制
2
1 1 1 1 1 1
1 2 3 4 5 6
输出
复制
Yes
No

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int a[10],b[N];
int v[10];
void solve()
{
	
	for(int i=1;i<=6;i++)  cin>>a[i],v[i]=0;
	sort(a+1,a+6+1);
	for(int i=1;i<=6;i++)  for(int j=i+1;j<=6;j++)  for(int k=j+1;k<=6;k++)  if(a[i]+a[j]>a[k])
	{
		int t=0;
		v[i]=v[j]=v[k]=1;
		for(int y=1;y<=6;y++)  if(!v[y])  b[++t]=a[y];
		if(b[1]+b[2]>b[3])
		{
			puts("Yes");
			return;
		} 
		v[i]=v[j]=v[k]=0;
	}
	puts("No");
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T=1;
	cin>>T;
	while(T--)  solve(); 
	return 0;
}

C 消减整数

题目描述
给出一个正整数H,从1开始减,第一次必须减1,每次减的数字都必须和上一次相同或者是上一次的两倍,请问最少需要几次能把H恰好减到0。
输入描述:
第一行给出一个正整数{T}T,1 \le T \le 10^41≤T≤10
4

接下来T行每行一个H,1 \le H \le 10^9H,1≤H≤10
9

输出描述:
每行一个正整数代表最少的次数
示例1
输入
复制
3
3
5
7
输出
复制
2
3
3
C++(clang++11)
ACM模式

1

保存并提交 执行结果自测输入代码调试

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int n,f[N],a,b;
int flag,ans;
map < int , int > mp;
int lowbit(int x)
{
	return x&(-x);
}
int dfs(int x)
{
	int sum=0,cnt=1;
	for(int i=1;x;i++)
	{
		if(lowbit(x)==lowbit(cnt)||i==1)  x-=cnt;
		else
		{
			cnt<<=1;
			x-=cnt;
		}
		ans++;
	}
	return ans;
}
void solve()
{
	cin>>n;
	flag=ans=0;

	cout<<dfs(n)<<endl;
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T=1;
	cin>>T;
	while(T--)  solve(); 
	return 0;
}

E 春游

题目描述
盼望着,盼望着,东风来了,春天脚步近了。

值此大好春光,老师组织了同学们出去划船,划船项目收费如下:

双人船最多坐两人,也可以坐一人,收费{a}a元

三人船最多坐三人,也可以坐两人或者一人,收费{b}b元

本次出游加上带队老师共{n}n人,如何安排能使得花费最小呢?

输入描述:
第一行给出一个正整数 T(1 \le T \le 1000)T(1≤T≤1000),代表测试数据的组数。

接下来 {T}T 行每行给出三个正整数n, a, b,1 \le n,a,b \le 10^9n,a,b,1≤n,a,b≤10
9
,含义如题。
输出描述:
每组输入输出一行,代表最小的花费

示例1
输入
复制
2
2 20 200
3 20 20
输出
复制
20
20

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int n,a[10],b[10],c[10];
int flag,ans;
void solve()
{
	cin>>n>>a[2]>>a[3];
	b[2]=n/2;
	b[3]=n/3;
	c[2]=n-(n/2)*2;
	c[3]=n-(n/3)*3;
	ans=flag=0;
	if(n==1||n==2)
	{
		cout<<min(a[2],a[3])<<endl;
		return;
	}
	if(n==3)
	{
		cout<<min(a[2]*2,a[3])<<endl;
	}
	if(a[2]*3<a[3]*2)
	{
		ans+=b[2]*a[2];
		if(c[2]!=0)  ans+=min(a[2],a[3]);
	}
	else if(a[2]*3<a[3]*2)
	{
		ans+=b[3]*a[3];
		if(c[3]!=0)  ans+=min(a[2],a[3]);
	}
	else
	{
		if(c[2]==0)
		{
			cout<<a[2]*b[2]<<endl;
			return;
		}
		if(c[3]==0)
		{
			cout<<a[3]*b[3]<<endl;
			return;
		}
		ans+=a[2]*b[2]+min(a[2],a[3]);
	}
	cout<<ans<<endl;
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T=1;
	cin>>T;
	while(T--)  solve(); 
	return 0;
}

F 五连珠

题目描述
将{1 \sim 25}1∼25混乱的填进两个5 \times 55×5的矩阵里,然后再给出1 \sim 251∼25的一个排列,按照排列依次划去两个矩阵中对应的元素,直到有矩阵被划掉的数字正好是一行一列或者主副对角线时结束。

输出结束时满足条件的是第几个矩阵,若两个矩阵同时满足,输出{0}0。

输入描述:
第一行一个正整数{T}T,代表测试数据的组数, {1≤T≤50}1≤T≤50

每组测试数据先给出两个{5 \times 5}5×5的矩阵,然后在一行中给出{1 \sim 25}1∼25的一个排列

输出描述:
每组数据输出 “0” or “1” or “2”.
示例1
输入
复制
2
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 05 18 19 12 08 21 15 06 10 16 03 24 20 25 13 23 11
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 13 05 18 19 12 08 21 15 06 10 16 03 24 20 25 23 11
输出
复制
2
0
备注:

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int a[5][55][55],b[55];
int f[5];
int n=5;
map < int , pair < int , int > > mp1,mp2;
int check()
{
	f[1]=f[2]=0;
	for(int id=1;id<=2;id++)
	{
		int cnt=0;
		int flag1=0,flag2=0;
		for(int i=1;i<=5;i++)
		{
			cnt=0;
			for(int j=1;j<=5;j++)  cnt+=a[id][i][j];
			if(cnt==0)  flag1=1; 
			cnt=0;
			for(int j=1;j<=5;j++)  cnt+=a[id][j][i];
			if(cnt==0)	flag2=1;
		}
		if(flag1+flag2)  f[id]=1;
		flag1=flag2=0;
		cnt=0;
		for(int i=1;i<=5;i++)  cnt+=a[id][i][i];
		if(cnt==0)	flag1=1;
		cnt=0;
		for(int i=1;i<=5;i++)  cnt+=a[id][i][6-i];
		if(cnt==0)	flag2=1;
		if(flag1+flag2)  f[id]=1;
	}
	return f[1]+f[2];
}
void solve()
{
	mp1.clear(),mp2.clear();
	for(int i=1;i<=5;i++)  for(int j=1;j<=5;j++)
	{
		int x;
		cin>>x;
		a[1][i][j]=x;
		mp1[x]=make_pair(i,j);
	}
	for(int i=1;i<=5;i++)  for(int j=1;j<=5;j++)
	{
		int x;
		cin>>x;
		a[2][i][j]=x;
		mp2[x]=make_pair(i,j);
	}
	for(int i=1;i<=25;i++)  cin>>b[i];
	for(int i=1;i<=25;i++)
	{
		int val=b[i];
		a[1][mp1[val].first][mp1[val].second]=0;
		a[2][mp2[val].first][mp2[val].second]=0;
//		if(i>=5)
//		{
			if(check())
			{
				if(f[1]==1&&f[2]==1)
				{
					puts("0");
					return;
				}
				if(f[1]==1)
				{
					puts("1");
					return;
				}
				puts("2");
				return;
			}
//		}
	}
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T=1;
	cin>>T;
	while(T--)  solve(); 
	return 0;
}

J 统计个数

题目描述
给出一张N个点M条边的图,假设图中有三个节点分别为a,b,c,若点a和点b之间有边并且b和c之间有边的话,我们就称(a,b,c)为一条线,同时视(c,b,a)和(a,b,c)为同一条线,而对于其他的组合则认为是和(a,b,c)不同的线。

如果(a,b,c)是一条线并且点a和点c之间也有边的话,我们称(a,b,c)构成一个三角,同理我们视由这三个点组成的三角为同一个三角,即(a, b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)、(c, b, a)只能被算一次

请分别统计给定的图中,三角和线的数量

输入描述:
第一行一个正整数T(1\le T \le 50)T(1≤T≤50),代表测试数据的组数

第二行给出一个正整数N, (3 \le N \le 200)N,(3≤N≤200),代表点数,图的节点编号为1 \sim N1∼N

第三行给出一个正整数M, (1 \le M \le \frac{N \times (N-1)}{2})M,(1≤M≤
2
N×(N−1)

),代表图中的边数

接下来M行每行给出两个正整数a_i,b_ia
i

,b
i

,代表a_i,b_ia
i

,b
i

之间有边相连

题目保证图中至少存在一条线并且不存在重边和自环

输出描述:
对于每组数据请输出一个分数代表三角和线数量的比,格式为{p} / {q}p/q,(其中p为三倍的三角的数量,q为线的数量)

请输出最简分数,若{p=0}p=0,则输出{0}/{1}0/1。

示例1
输入
复制
3
5
7
1 2
2 3
1 3
3 4
2 4
4 5
1 5
3
3
1 2
3 1
3 2
4
3
1 2
2 3
3 4
输出
复制
6/13
1/1
0/1

数线的时候,枚举中点即可

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
struct node
{
	int ver,next;
}e[N];
int tot,head[N];
int n,m;
int cnt,ans,root;
int v[N],d[505][505];
void add(int x,int y)
{
	e[++tot].ver=y;
	e[tot].next=head[x];
	head[x]=tot;
}
void addedge(int x,int y)
{
	add(x,y);add(y,x);
}
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
void init()
{
	ans=cnt=tot=0;
	memset(head,0,sizeof(head));
	memset(v,0,sizeof(v));
	memset(d,0,sizeof(d));
}
void solve()
{
	init();
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(x,y);
		d[x][y]=d[y][x]=1;
	}
	for(int i=1;i<=n;i++)  for(int j=1;j<=n;j++)  for(int k=1;k<=n;k++)
		ans+=d[i][j]*d[j][k]*d[i][k];
	for(int x=1;x<=n;x++)
	{
		int sum=0;
		for(int i=head[x];i;i=e[i].next)  sum++;
		cnt+=sum*(sum-1)/2;
	}
	ans/=2;
	int d=gcd(ans,cnt);
	printf("%d/%d\n",ans/d,cnt/d);
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T=1;
	cin>>T;
	while(T--)  solve(); 
	return 0;
}