首页 > 其他分享 >「杂题乱刷」AT_abc337_e

「杂题乱刷」AT_abc337_e

时间:2024-01-21 12:57:39浏览次数:31  
标签:cout forl abc337 饮料 小白鼠 编号 杂题 define

题目链接

题目传送门(at)

题目传送门(luogu)

题意简述

有 \(n\) 瓶果汁,其中有一瓶坏的,你需要使用最少的小白鼠使得这些小白鼠能找出已经变质的果汁的编号,对于每只小白鼠,你可以给他们喝任意瓶不重复的果汁,每瓶果汁可以被平均分。

解题思路

妙妙构造题。

思路一:

拿 \(n\) 个小白鼠,每个小白鼠喝编号不同的饮料,这也是最简单的思路,但无法通过此题。

思路二:

拿 \(n-1\) 个小白鼠,每只小白鼠编号分别为 \(1,2,\dots,n-1\),对于编号为 \(i\) 的小白鼠,就喝第 \(i,i+1\) 瓶的饮料,最后的饮料编号很容易求出,但无法通过此题。

此思路参考代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define map unordered_map
#define forl(i,a,b) for(register long long i=a;i<=b;i++)
#define forr(i,a,b) for(register long long i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define cin(x) scanf("%lld",&x)
#define cout(x) printf("%lld",x)
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//#define endl '\n'
#define QwQ return 0;
#define ll long long
string s;
ll n,a[110];
int main()
{
	IOS;
	cin>>n;
	cout<<n-1<<endl;
	forl(i,1,n-1)
		cout<<"2 "<<i<<" "<<i+1<<endl;
	cin>>s;
	forl(i,0,s.size()-1)
		a[i+1]=s[i]-'0';
	forl(i,1,n-1)
		if(a[i] && a[i+1])
		{
			cout<<i+1<<endl;
			QwQ;
		}
	if(a[1] && !a[2])
		cout<<1<<endl;
	else
		cout<<n<<endl;
	QwQ;
}

思路三:

拿 \(\lceil \log_2(n) \rceil\) 个小白鼠,编号为 \(i\) 的小白鼠都喝下饮料编号 \(\bmod 2^i=1\) 的所有饮料,这样,若最后给出的字符串第 \(i\) 位为 \(1\),说明最终饮料编号的第 \(i\) 位为 \(1\),最后饮料编号直接计算即可,但是此思路还是无法通过此题。

此思路参考代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define map unordered_map
#define forl(i,a,b) for(register long long i=a;i<=b;i++)
#define forr(i,a,b) for(register long long i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define cin(x) scanf("%lld",&x)
#define cout(x) printf("%lld",x)
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//#define endl '\n'
#define QwQ return 0;
#define ll long long
ll n,ans;
string s[110],sss;
void init()
{
	forl(i,1,100)
	{
		ll x=i;
		string ss="";
		while(x)
			ss+=x%2+'0',x/=2;
		//reverse(ss.begin(),ss.end());
		ss+="0000000000000000000000";
		s[i]=ss;
	}
}
ll query(ll x)
{
	ll su=0;
	while(x)
		x/=2,su++;
	return su;
}
long long pw(long long x,long long y,long long mod)
{
	if(y==0)
		return 1;
	long long an=1,tmp=x;
	while(y!=0)
	{
		if(y&1)
			an=(an%mod*tmp%mod)%mod;
		tmp=(tmp%mod*tmp%mod)%mod;
		y=y>>1;
	}
	an=an%mod;
	return an%mod;
}
int main()
{
	IOS;
	init();
	cin>>n;
	cout<<query(n)<<endl;
	ll cs=query(n);
	forl(i,1,cs)
	{
		ll sum=0;
		ll ans[110]={0};
		forl(j,1,n)
			if(s[j][i-1]=='1')
				sum++,ans[sum]=j;
		cout<<sum<<" ";
		forl(i,1,sum)
			cout<<ans[i]<<" ";
		cout<<endl;
	}
	cin>>sss;
	forl(i,0,cs-1)
		if(sss[i]=='1')
			ans+=pw(2,i,1e18
	cout<<ans<<endl;
	QwQ;
}

思路四:

分两种情况考虑:

  • 若 \(\lceil \log_2(n) \rceil = \log_2(n)\),则拿 \(\lceil \log_2(n) \rceil - 1\) 个小白鼠,编号为 \(i\) 的小白鼠都喝下饮料编号 \(\bmod 2^i=1\) 的所有饮料,这样,若最后给出的字符串第 \(i\) 位为 \(1\),说明最终饮料编号的第 \(i\) 位为 \(1\),最后饮料编号直接计算即可,若给出的字符串均为 \(0\),则容易得出最后的饮料编号为 \(n\)。

  • 若 \(\lceil \log_2(n) \rceil \neq \log_2(n)\),则拿 \(\lceil \log_2(n) \rceil\) 个小白鼠,编号为 \(i\) 的小白鼠都喝下饮料编号 \(\bmod 2^i=1\) 的所有饮料,这样,若最后给出的字符串第 \(i\) 位为 \(1\),说明最终饮料编号的第 \(i\) 位为 \(1\),最后饮料编号直接计算即可。

此思路可以通过此题。

此思路参考代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define map unordered_map
#define forl(i,a,b) for(register long long i=a;i<=b;i++)
#define forr(i,a,b) for(register long long i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define cin(x) scanf("%lld",&x)
#define cout(x) printf("%lld",x)
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//#define endl '\n'
#define QwQ return 0;
#define ll long long
ll n,ans;
string s[110],sss;
long long pw(long long x,long long y,long long mod)
{
	if(y==0)
		return 1;
	long long an=1,tmp=x;
	while(y!=0)
	{
		if(y&1)
			an=(an%mod*tmp%mod)%mod;
		tmp=(tmp%mod*tmp%mod)%mod;
		y=y>>1;
	}
	an=an%mod;
	return an%mod;
}
map<ll,ll>vis;
void init()
{
	forl(i,0,20)
		vis[pw(2,i,1e18)]=1;
	forl(i,1,100)
	{
		ll x=i;
		string ss="";
		while(x)
			ss+=x%2+'0',x/=2;
		//reverse(ss.begin(),ss.end());
		ss+="0000000000000000000000";
		s[i]=ss;
	}
}
ll query(ll x)
{
	ll su=0;
	while(x)
		x/=2,su++;
	return su;
}
int main()
{
	IOS;
	init();
	cin>>n;
	if(!vis[n])
	{
		cout<<query(n)<<endl;
		ll cs=query(n);
		forl(i,1,cs)
		{
			ll sum=0;
			ll ans[110]={0};
			forl(j,1,n)
			{
				if(s[j][i-1]=='1')
					sum++,ans[sum]=j;
			}
			cout<<sum<<" ";
			forl(i,1,sum)
				cout<<ans[i]<<" ";
			cout<<endl;
		}
		cin>>sss;
		forl(i,0,cs-1)
			if(sss[i]=='1')
				ans+=pw(2,i,1e18);
		cout<<ans<<endl;
	}
	else
	{
		cout<<query(n)-1<<endl;
		ll cs=query(n)-1;
		forl(i,1,cs)
		{
			ll sum=0;
			ll ans[110]={0};
			forl(j,1,n)
				if(s[j][i-1]=='1')
					sum++,ans[sum]=j;
			cout<<sum<<" ";
			forl(i,1,sum)
				cout<<ans[i]<<" ";
			cout<<endl;
		}
		cin>>sss;
		forl(i,0,cs-1)
			if(sss[i]=='1')
				ans+=pw(2,i,1e18);
		if(ans)
			cout<<ans<<endl;
		else
			cout<<n<<endl;
	}
	QwQ;
}

标签:cout,forl,abc337,饮料,小白鼠,编号,杂题,define
From: https://www.cnblogs.com/wangmarui/p/17977726

相关文章

  • ABC337 D Cheating Gomoku Narabe 题解
    QuestionABC337DCheatingGomokuNarabe给出一个\(H\timesW\)的矩阵,由o,x,.组成,一次操作为把一个.变成o,问需要最少多少次操作使得横着或竖着有连续的\(K\)个oSolution先来考虑只有一行的情况,我们定义一个长度为\(K\)的"窗口",假设需要把这个"窗口"里面的所有......
  • ABC337
    T1:Scoreboard模拟代码实现n=int(input())st,sa=0,0foriinrange(n):x,y=map(int,input().split())st+=x;sa+=yifst<sa:print('Aoki')ifst==sa:print('Draw')ifst>sa:print('......
  • Petrozavodsk Summer 2019. Day 9. MEX Foundation Contest【杂题】
    比赛链接A.TheOnePolynomialMan给定模数\(p\)和\(0\simp-1\)的两个集合\(U,V\),求有多少个有序对\((a,b)\)满足:\(f(a,b)=\prod\limits_{z\inV}\left(\frac{(2a+3b)^2+5a^2}{(3a+b)^2}+\frac{(2a+5b)^2+3b^2}{(3a+2b)^2}-z\right)\equiv0\pmo......
  • 【杂题乱写】2024.01 #2
    AtCoder-JOIOPEN2022_Aシーソー开局考虑二分,然后不会做,没想到不需要二分。以初始的重心为基准,记为\(mid\),可以对操作\(i\)次得到的所有可能区间求出重心在\(mid\)左侧且最靠右的以及在\(mid\)右侧且最靠左的两个区间,容易发现这两个区间左右端点都差\(1\),记靠左的一个......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 搜索学习笔记+杂题 (进阶一 dfs/bfs的进阶)
    前言:没啥好说的了。所以只能来写博客了。搜索杂题:相关题单:戳我二、进阶dfs/bfs1、dfs进阶——折半搜索(meetinthemiddle)由于深搜的时间复杂度在每种状态有两个分支的情况下是\(O(2^n)\)。所以一般暴力深搜的数据范围就在\(20-25\)之间。而对于有一大类的题,它的搜索思......
  • ZJOI 杂题选做
    P2272[ZJOI2007]最大半连通子图题目传送门注意到半联通子图缩完点一定是一条链,由于要求的是最大的半联通子图,所以该子图的每个强连通分量一定对应原图的完整的强连通分量,否则可以扩展。则对原图缩点,最大半联通子图一定是从入度为0的点到出度为0的点的一条链,拓扑求出带权......
  • 搜索学习笔记+杂题 (基础二 dfs/bfs的拓展)
    搜索杂题:博客中讲述的题的题单:戳我二、dfs/bfs的各种变式1、深搜深搜以指数级的时间复杂度闻名,稍不注意时间就会爆炸,所以一般会用到剪枝的技巧(这个技巧基本上是因题而异,需要平时的刷题与积累)。深搜同样也是一种可变性极高的算法(其实都可以不叫做一种算法,深搜已经是一种做题的......
  • 1 月杂题题解
    好久没写博客了?今晚写爽。P5311成都七中这有黑?对于一个点\(x\),设其子树任意一点为\(y\)。我们可以求出这\(x\rightarrowy\)这条路径经过节点的的\(l,r\)。遍历\(x\)的子树,我们可以得到一些三元组\((l,r,c)\)表示\(x\)所属连通块包含了\(l,r\)这些节点,就有一......
  • 「杂题乱刷」CF1916C
    题目传送门(CF)题目传送门(luogu)容易发现,选择两个偶数对于答案没有任何影响,因此先手必然会优先选择两个奇数合并在一起,而后手必然会优先选择一个奇数和一个偶数在一起,我们举个例子,有一个序列\(\{1,1,1,1,1,1\}\),先手先取编号为\(1,2\)的两个数,后手再取编号为\(2,3\)的两个数,此......