首页 > 其他分享 >DISCO Presents Discovery Channel Code Contest 2020 Qual

DISCO Presents Discovery Channel Code Contest 2020 Qual

时间:2023-09-27 19:12:26浏览次数:33  
标签:Code Contest int res long DISCO else ans include

A - DDCC Finals

直接模拟即可。


#include<iostream>
#include<cstdio>
using namespace std;
int x,y;
int main()
{
	scanf("%d%d",&x,&y);
	int ans=0;
	if(x==1) ans+=30;
	else if(x==2) ans+=20;
	else if(x==3) ans+=10;
	if(y==1) ans+=30;
	else if(y==2) ans+=20;
	else if(y==3) ans+=10;
	if(x==1&&y==1) ans+=40;
	ans*=10000;
	printf("%d",ans);
	return 0;
}

B - Iron Bar Cutting

直接枚举分界点,每次计算一下代价取个最小值即可。


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200005;
int n;
int a[N];
long long sum[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
		sum[i]=sum[i-1]+a[i];
	long long ans=1e18;
	for(int i=1;i<n;i++)
		ans=min(ans,abs(sum[i]-(sum[n]-sum[i])));
	printf("%lld",ans);
	return 0;
}

C - Strawberry Cakes

考虑对于有草莓的行,直接将草莓看做分界点,把每个块分给靠近它的块就好了。没有草莓的行上下找一个有草莓的行复制一份就是了。


#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=305;
int h,w,k;
char s[N][N];
int ans[N][N];
bool book[N];
int main()
{
	scanf("%d%d%d",&h,&w,&k);
	for(int i=1;i<=h;i++)
		scanf("%s",s[i]+1);
	book[0]=book[h+1]=true;
	int tot=0;
	for(int i=1;i<=h;i++)
	{
		vector<int>pos;
		for(int j=1;j<=w;j++)
			if(s[i][j]=='#') pos.push_back(j);
		if(pos.empty())
		{
			book[i]=true;
			continue;
		}
		for(int l=1;l<pos.size();l++)
		{
			tot++;
			for(int j=pos[l-1];j<pos[l];j++)
				ans[i][j]=tot;
		}
		ans[i][pos.back()]=++tot;
		for(int j=pos.front()-1;j>=1;j--)
			if(!ans[i][j]) ans[i][j]=ans[i][j+1];
		for(int j=pos.front()+1;j<=w;j++)
			if(!ans[i][j]) ans[i][j]=ans[i][j-1];
	}
	for(int i=1;i<=h;i++)
		if(book[i]&&!book[i-1])
		{
			for(int j=1;j<=w;j++)
				ans[i][j]=ans[i-1][j];
			book[i]=false;
		}
	for(int i=h;i>=1;i--)
		if(book[i]&&!book[i+1])
		{
			for(int j=1;j<=w;j++)
				ans[i][j]=ans[i+1][j];
			book[i]=false;
		}
	for(int i=1;i<=h;i++)
	{
		for(int j=1;j<=w;j++)
			printf("%d ",ans[i][j]);
		printf("\n");
	}
	return 0;
}

D - Digit Sum Replace

可以发现,无论怎么操作答案都是一样的,只需要计算出一种方案下的答案就是了。

具体证明的话可以考虑每次操作要不就是使得位数减一或者总和减九,这两个是独立的。


#include<iostream>
#include<cstdio>
using namespace std;
const int N=200005;
int n;
int d[N];
long long c[N];
int main()
{
	scanf("%d",&n);
	long long sumc=0,sum=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%lld",&d[i],&c[i]);
		sumc+=c[i],sum+=d[i]*c[i];
	}
	printf("%lld",(sum-1)/9+sumc-1);
	return 0;
}

E - Majority of Balls

令 \(f(i)\) 表示询问 \([l,l+n-1]\) 这个区间。可以发现对于一个 \(i\),如果 \(f(i)\neq f(i+1)\),则我们可以知道 \(i\) 和 \(i+n\) 的位置上的颜色,且 \([i+1,i+n-1]\) 这个区间一定是红蓝相等的,我们就可以拿这个区间去询问出剩下的位置的颜色。

考虑找出这个 \(i\) 的位置,可以发现,对于 \(f(1)\neq f(n+1)\),则在这个区间内必有一个位置 \(i\) 使得 \(f(i)\neq f(i+1)\),具体可以二分 \(mid\),如果 \(f(mid)=f(l)\neq f(r)\),则在 \([mid,r]\) 这段区间内一定有一个位置满足条件,继续在这个区间内找即可。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=205;
int n;
int query(const vector<int>&A)
{
	cout<<"? ";
	for(int u:A)
		cout<<u<<" ";
	cout<<endl;
	string s;
	cin>>s;
	if(s=="Red") return 1;
	else if(s=="Blue") return 0;
	else return -1;
}
vector<int> build(int l,int r)
{
	vector<int>res;
	for(int i=l;i<=r;i++)
		res.push_back(i);
	return res;
}
vector<int> operator+(const vector<int>&a,const vector<int>&b)
{
	vector<int>res;
	for(int u:a)
		res.push_back(u);
	for(int u:b)
		res.push_back(u);
	return res;
}
char ans[N];
int res[N];
int get(int u)
{
	if(res[u]!=-1) return res[u];
	else return res[u]=query(build(u,u+n-1));
}
int main()
{
	cin>>n;
	int l=1,r=n+1;
	memset(res,-1,sizeof(res));
	while(l<r-1)
	{
		int mid=(l+r)/2;
		auto check=[=](int x)->bool{return get(l)==get(x);};
		if(check(mid)) l=mid;
		else r=mid;
	}
	int L=l+1,R=l+n-1;
	vector<int>add=build(L,R);
	vector<int>posr,posb;
	for(int i=1;i<=L-1;i++)
		if(query((vector<int>){i}+add)) ans[i]='R',posr.push_back(i);
		else ans[i]='B',posb.push_back(i);
	for(int i=R+1;i<=n*2;i++)
		if(query(add+(vector<int>){i})) ans[i]='R',posr.push_back(i);
		else ans[i]='B',posb.push_back(i);
	vector<int>q;
	for(int i=0;i<n/2;i++)
		q.push_back(posr[i]),q.push_back(posb[i]);
	for(int i=L;i<=R;i++)
		if(query(q+(vector<int>){i})) ans[i]='R';
		else ans[i]='B';
	cout<<"! ";
	for(int i=1;i<=n*2;i++)
		cout<<ans[i];
	cout<<endl;
	return 0;
}

F - DISCOSMOS

考虑找到移动的一个循环节,如果这个循环节内的合法那么整个就一定合法,否则一定不合法。循环节就是 \(g=\frac{H}{\gcd(H,T)},h=\frac{W}{\gcd(W,T)}\),问题就变成了 \(T=1\) 的情况,最后再乘上 \(\frac{n\cdot m}{g\cdot h}\) 就是答案了。

合法的方案可以分成几种情况:

  • 只往右移,一行要么不移,要么全移,方案数为 \(2^g-1\);
  • 只往下移,一列要么不移,要么全移,方案数为 \(2^h-1\);
  • 既往右移又下移,确定一个点以后可以确定 \(\gcd(h,g)\) 个格子,每个格子可以往下或往右,方案数为 \(2^{\gcd(h,g)}-2\)。

#include<iostream>
#include<cstdio>
using namespace std;
const int MOD=1000000007;
int n,m,t;
int g,h;
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
long long ksm(long long a,long long b)
{
	long long res=1;
	while(b)
	{
		if(b&1) res=res*a%MOD;
		a=a*a%MOD,b>>=1;
	}
	return res;
}
int main()
{
	scanf("%d%d%d",&n,&m,&t);
	g=n/gcd(n,t),h=m/gcd(m,t);
	long long res=1;
	res=(res+ksm(2,g)-1)%MOD;
	res=(res+ksm(2,h)-1)%MOD;
	res=(res+ksm(2,gcd(g,h))-2)%MOD;
	res=ksm(res,1LL*(n/g)*(m/h))%MOD;
	printf("%lld",res);
	return 0;
}

标签:Code,Contest,int,res,long,DISCO,else,ans,include
From: https://www.cnblogs.com/zhou-jk/p/17733761.html

相关文章

  • diverta 2019 Programming Contest
    A-ConsecutiveIntegers答案为\(n-k+1\)。#include<iostream>#include<cstdio>usingnamespacestd;intn,k;intmain(){ scanf("%d%d",&n,&k); printf("%d",n-k+1); return0;}B-RGBBoxes枚举\(r,g\),判断一下对应的......
  • AtCoder Grand Contest 048
    A-atcoder<S枚举操作完的串\(s\)和atcoder相同的前缀长度,算出前面的前缀相同的代价加上当前这位大于atcoder中对应的那一位的代价即为达到当前状态的代价,取个最小值即可。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintN=1......
  • AtCoder Grand Contest 046
    A-Takahashikun,TheStrider问题就是要你求\(ax\equiv0\pmod{360}\)中\(a\)的最小值。答案就是\(a=\frac{360}{\gcd(x,360)}\)。代码:#include<iostream>#include<cstdio>usingnamespacestd;intx;intgcd(inta,intb){ returnb==0?a:gcd(b,a%b);......
  • AtCoder Grand Contest 047
    A-IntegerProduct考虑将原来的数全部化为整数,乘上\(10^9\),那么问题就变成了是否有两个数的乘积是\(10^{18}\)的倍数。考虑如果是\(10^{18}\)的倍数的话必然是\(2^{18}\)和\(5^{18}\)的倍数,那么分解出每个数的\(2,5\)因子数量,然后再看看有多少个数与它\(2,5\)的因......
  • AtCoder Grand Contest 043
    A-RangeFlipFindRoute可以发现,一条路径的最小操作数等于路径上有多少#的块,令\(f_{i,j}\)表示到\((i,j)\)的最小操作次数,直接DP就行了。注意路径上一个\(1\)的块会被算两次,需要除以\(2\)。#include<iostream>#include<cstdio>#include<cstring>usingnamesp......
  • AtCoder Grand Contest 044
    A-PaytoWin不妨将操作倒过来考虑,问题就变成了每次除以\(2,3,5\)或者\(+1,-1\),令\(f_n\)表示将\(n\)变成\(0\)的最小花费,然后记忆化搜索即可,可以证明复杂度是对的。代码:#include<iostream>#include<cstdio>#include<map>usingnamespacestd;intT;longlong......
  • AtCoder Grand Contest 045
    A-XorBattle可以发现,从后往前扫,遇到一个\(1\)找后面是否有若干个\(0\)的位置的\(a_i\)与当前位置的异或和相等,用线性基维护一下就好了。代码:#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintN=205;intT;intn;longlong......
  • 音频数据的自定义DataLoader及其AutoEncoder降噪算法
    DataLoader要求每一个Batch里面的数据的shape都一样,但是语音数据显然不可能都是等长的,因为每一条语音长度都不一样,因此在定制DataLoader的时候还要对每一个batch的数据进行剪裁(crop)或者填充(padding)处理。这里采用padding来对齐数据,方法采用PytorchDiscussion的网友Felix......
  • 算法训练day22 LeetCode235
    算法训练day22LeetCode235.701.450.235.二叉搜索树的最近公共祖先题目235.二叉搜索树的最近公共祖先-力扣(LeetCode)题解代码随想录(programmercarl.com)对于二叉树,可以用递归回溯的方式对于二叉搜索树,由其根节点大于左右子树中结点,所以当第一次遍历到根节点值......
  • B. Amr and Pins( Codeforces Round #287 (Div. 2))
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>intmain(){doubler,x1,y1,x2,y2;while(scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2)!=EOF){doubleaa=sq......