Codeforces Round #730 (Div. 2)

https://codeforces.com/contest/1543/problem/A

不算签到了。

给你两个数a,b,你可以把a,b同时加或者减1,请问经过多少次操作可以得到他们的最大公因数。

要求输出这个最大公因数和操作次数

与n最接近的大于k的倍数:n+k-n%k;

与n最接近的小于k的倍数:n-n%k;

根据__gcd(a,b)=__gcd(a-b,b),而且他们的最大公因数等于他们自身,所以只需要求出a-b,取

min((n+k-n%k),(n-n%k))即可。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int t,n,m;
void solve()
{
	cin>>n>>m;
	if(n<m)swap(n,m);
	if(n==m)
	{
		cout<<0<<endl;
		return;
	}
	int tmp=abs(n-m);
	cout<<min((tmp-n%tmp),(n%tmp))<<endl;
}

int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

https://codeforces.com/contest/1543/problem/B

设不方便数为

 给你一个数列,你可以做任意次操作,令这个数列在综合不变的情况下不方便数最小(也就是说整数可以拆)

简单,求和取平均数,然后输出(n-sum/n)*(sum/n)即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=2e5+5;
ll t,n,num[maxn],sum,avg,cnt;
void solve()
{
	sum=0;
	cin>>n;
	rep(i,1,n)
	{
		cin>>num[i];
		sum+=num[i];
	}
	avg=sum/n;
	
	cnt=(sum-avg*n);
	cout<<(n-cnt)*cnt<<endl;
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

 https://codeforces.com/contest/1543/problem/C

读题读到我直接裂开。。

给出三个概率 c,m,p,和一个数v,如果抽到c,m则其减少v,均分到其余两个概率中,若其中一个概率为0,则均分到p中,如果抽到p,游戏结束。问轮次的期望。

dfs即可

注意浮点误差,不能等于0,要小于1e-6(题目给定的数)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const double inf=1e-6;
int t; double c,m,p,v,minn;
double dfs(double c,double m,double p,int pos,double sum)
{
	double res=0;
	res += p*pos*sum;
	//printf("%lf %lf %lf %d %lf %lf\n",c,m,p,pos,p*sum,p*pos*sum);
	if(c<inf&&m<inf)return res;
	if(c>inf)
	{
		minn=min(c,v);
		if(m>inf)
		{
			res+=dfs(c-minn,m+minn/2,p+minn/2,pos+1,sum*c);
		}
		else res+=dfs(c-minn,0,p+minn,pos+1,sum*c);
	}
	if(m>inf)
	{
		minn=min(m,v);
		if(c>inf)
		{
			res+=dfs(c+minn/2,m-minn,p+minn/2,pos+1,sum*m);
		}
		else res+=dfs(0,m-minn,p+minn,pos+1,sum*m);
	}
	//cout<<res<<endl;
	//cout<<res<<endl;
	return res;
}
void solve()
{
	cin>>c>>m>>p>>v;
	printf("%.12lf\n",dfs(c,m,p,1,1));
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

https://codeforces.com/contest/1543/problem/D1

交互题,

有一个密码,范围为0到n,如果输入正确输出1,错误输出0;

当输入错误时,密码改变为 这个密码 异或 你输入的数,最多输入n次。

请你根据输出,猜测密码。

由于异或运算 异或两个相同的数会变回原来的数,而且异或运算有交换律。

则若密码为n,我输入 (i^(i-1))即可使得上一次输出错误被异或(i-1)的密码恢复原密码。故只需要n次就可以猜出来。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const double inf=1e-6;
int t; double c,m,p,v,minn;
double dfs(double c,double m,double p,int pos,double sum)
{
	double res=0;
	res += p*pos*sum;
	//printf("%lf %lf %lf %d %lf %lf\n",c,m,p,pos,p*sum,p*pos*sum);
	if(c<inf&&m<inf)return res;
	if(c>inf)
	{
		minn=min(c,v);
		if(m>inf)
		{
			res+=dfs(c-minn,m+minn/2,p+minn/2,pos+1,sum*c);
		}
		else res+=dfs(c-minn,0,p+minn,pos+1,sum*c);
	}
	if(m>inf)
	{
		minn=min(m,v);
		if(c>inf)
		{
			res+=dfs(c+minn/2,m-minn,p+minn/2,pos+1,sum*m);
		}
		else res+=dfs(0,m-minn,p+minn,pos+1,sum*m);
	}
	//cout<<res<<endl;
	//cout<<res<<endl;
	return res;
}
void solve()
{
	cin>>c>>m>>p>>v;
	printf("%.12lf\n",dfs(c,m,p,1,1));
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值