首页 > 其他分享 >Codeforces Round 978 (Div. 2) A-D1 题解

Codeforces Round 978 (Div. 2) A-D1 题解

时间:2024-10-14 09:48:18浏览次数:6  
标签:return cout int 题解 Codeforces long 978 ai solve

我的同学还在 VP,排名马上放

声明:不要觉得有 subtask 的题目只做 Easy version 没有意义,从这里也能捞很多分,况且有的时候并不是简单和难的区别,而是考不同的算法

A. Bus to Pénjamo

题意

有一辆车上面有 $r$ 排座位,每排有 $2$ 个座位,现在共 $n$ 个家庭出行坐公交车,每个家庭 $a_i$ 个人(保证 $2r\ge \sum a_i$)。

一个人感到 开心,当且仅当符合一下条件 之一

  • 他和他的家庭成员坐在一排
  • 他独自一人坐在一排(旁边不能有其他人)

问最终最多有多少人 开心

思路

贪心,先让可以两个人一排的家庭成员入座,剩下的看 $[座位数]$ 与 $[剩余人数]$ 的差,得出有多少人能单独坐一排

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,r;
void solve(){
	cin>>n>>r;
	int k=0;
	int ans=0;
	for(int i=0;i<n;i++){
		int ai;
		cin>>ai;
		k+=(ai%2); //k表示每个家庭落单的人数
		r-=(ai/2); //r最终表示还剩下几排座位
		ans+=ai-ai%2;
	}
	r*=2; //还剩r个座位
	ans+=min(r-k,k);
	cout<<ans<<endl;
}
signed main(){
    int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

B. Kar Salesman

题意

共有 $n$ 中型号的车,第 $i$ 种型号的车有 $a_i$ 辆,每次 $\text{Karel}$ 可以推荐别人购买至多 $x$ 辆车,且这些为 不同型号

问至少要推销给多少个人才能卖完这些车

思路

求出车数量的总和(设为 $sum$ ),和 $a_i$ 的最大值(设为 $mx$),最终答案为:$\displaystyle \max(mx,\lceil \frac{sum}{x} \rceil)$

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
	int n,x;
	cin>>n>>x;
	int mx=0,sum=0;
	for(int i=0;i<n;i++){
		int ai;
		cin>>ai;
		mx=max(mx,ai);
		sum+=ai;
	}
	cout<<max(mx,(sum+x-1)/x)<<endl;
}
signed main(){
    int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

C. Gerrymandering

题意

一个 $2*n$ 的网格图,每格代表一个居民(需要进行投票选举,可以投给 A 也可以投给 J),保证 $2n \bmod 3 =0$,将它分成 连通的 $3$ 个一组,这一组 将投给 三个人投的更多的人,如 $2$ 个 A $1$ 个 J,则这一组投给 A

问:若按最优方案分组,最终投给 $A$ 的组最多有多少

pAtVass.md.png

思路

需要动态规划,仅分为以下情况:

pAtVhe1.png

那么,只要转移正确就很简单

转移直接看代码

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=2e9;
int n;
bool check(int a,int b,int c){
	int p=(a=='A'),q=(b=='A'),r=(c=='A');
	return (p+q+r>=2);
}
void solve(){
	cin>>n;
	string s[2];
	cin>>s[0]>>s[1];
	vector<vector<int> > dp(2,vector<int>(n+1,-inf));
	dp[0][0]=0;
	for(int i=0;i<n;i++){
		if(i%3==0){
			dp[0][i+3]=max(dp[0][i+3],
                           dp[0][i]+check(s[0][i],s[0][i+1],s[0][i+2])	//###
                           +check(s[1][i],s[1][i+1],s[1][i+2]));		//###

			dp[0][i+1]=max(dp[0][i+1],									//##
                           dp[0][i]+check(s[0][i],s[1][i],s[0][i+1]));	//#.
            
			dp[1][i+1]=max(dp[1][i+1],										//#.
                           dp[0][i]+check(s[0][i],s[1][i],s[1][i+1]));		//##

		}else if(i%3==1){
			if(i<n-3){
				dp[0][i+3]=max(dp[0][i+3],
                               dp[0][i]+check(s[0][i+1],s[0][i+2],s[0][i+3])	//.###
                               +check(s[1][i],s[1][i+1],s[1][i+2]));			//###.
                
				dp[1][i+3]=max(dp[1][i+3],
                               dp[1][i]+check(s[0][i],s[0][i+1],s[0][i+2])	//###.
                               +check(s[1][i+1],s[1][i+2],s[1][i+3]));		//.###
			}
            
			dp[0][i+2]=max(dp[0][i+2],										//.#
                           dp[0][i]+check(s[1][i],s[1][i+1],s[0][i+1]));	//##
	
			dp[0][i+2]=max(dp[0][i+2],										//##
                           dp[1][i]+check(s[0][i],s[0][i+1],s[1][i+1]));	//.#
		}
	}
	cout<<dp[0][n]<<endl;
}
signed main(){
    int t
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D1. Asesino (Easy Version)

题意

这是一道 交互题

有一种游戏,共有三种角色:Knight, Knave, Impostor,可以理解为:好人、坏人和内鬼

每局游戏有 $n$ 个人,其中有 $1$ 个内鬼,若干个好人和坏人(可能 $0$ 个)

你忘记了每个人的角色,但是,你可以问玩家 $i$ :玩家 $j$ 是不是好人?询问格式:? i j

玩家 $i$ 会回答你 1 表示是好人,0 表示不是好人

以下为不同身份的回答表格:

pAtVLyd.png

最多询问 $n+69$ 次,请找出内鬼是玩家几,格式为 ! i

思路

观察表格发现,若 $[i\ 认为 \ j 的身份]$ 和 $[j \ 认为\ i\ 的身份]$ 不同,那么 $i$ 和 $j$ 中必定有一个内鬼

那么我们可以问每两个相邻的人,$i$ 和 $i+1$ 互相问,$i+2$ 和 $i+3$ 互相问,以此类推,最终找到 $k$ 和 $k+1$ 不同的位置,再和其他的比较,就可以得到内鬼的位置

C++ 代码

#include<bits/stdc++.h>
using namespace std;
int n;
bool query(int a,int b){
	cout<<"? "<<a<<" "<<b<<endl;
	int p;
	cin>>p;
	cout<<"? "<<b<<" "<<a<<endl;
	int q;
	cin>>q;
	return p!=q;
}
void solve(){
	cin>>n;
	int pos=-1;
	for(int i=1;i<n;i+=2){
		bool flag=query(i,i+1);
		if(flag){
			pos=i;
			break;
		}
	}
	if(pos==-1){
		cout<<"! "<<n<<endl;
	}else if(query(pos,pos>1?pos-1:pos+2)){
		cout<<"! "<<pos<<endl;
	}else{
		cout<<"! "<<pos+1<<endl;
	}
}
int main(){
    int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

标签:return,cout,int,题解,Codeforces,long,978,ai,solve
From: https://www.cnblogs.com/AKDreamer-HeXY/p/18463490

相关文章

  • 洛谷 P2071 座位安排题解
    因为一个人坐一个座位很像二分图,题意转化为二分图最大匹配。把人放在左部,把座位放在右部,一排座位占右部的两个点。假设人想要坐在\(x\)排,那么建图的时候就可以将这个人连向\(2x\)和\(2x+1\)。这样一排就对应着两个人了。由于\(n\le4000\),直接由朴素的\(O(nm)\)的匈牙利......
  • 【题解】CEIT 2024 第三周算法训练 讲义题解
    A.Orange的作文排版关于处理若干行输入,我们可以用while结合getline函数来完成,每次读取一行,就让行数+1,然后每次利用string的size方法得到当前行的列数,更新最长的列,最后得到答案。#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;inta=0;i......
  • codeforces round 977 (div.2) C2(访问set的第一个元素,观察数据规律-出现次序,用set记
    解题历程:我首先想到的是等效法,每一次操作可以等效为每次将第一个人抽出放入一组,后面的人往前移,而该组的人就是可以任意放置的人,当b中后面再出现与前一个相同的人时,就不进行操作,当b中出现不同的人时,就看看这组中有没有这个人,有的话就下一个循环,没有的话就看看这个新的人是否按a中......
  • 01背包问题/Ieee全球极限编程大赛11.0题BeetleBag题解/洛谷P1926 小书童——刷题大军
    基础01背包问题概述给出一个容积为V的背包,有i个物体,每个物体都有自己的体积和价值,用Vi和Wi表示,要将这些物体装进背包里面,问怎样才能使得装入物体的总价值最大?最大为多少?解决思路1.如果你没能正确理解这道题,尤其是对于很多新手,第一反应可能是将所有物体的单位价值算出来,然后......
  • 带中位数写法的快速排序再讨论 & leetcode 215. Kth Largest Element in an Array题解
    带中位数写法的快速排序再讨论&leetcode215.KthLargestElementinanArray题解 探讨带中位数的写法本身classSolution{public:intfindKthLargest(std::vector<int>&nums,intk){returnfakeQuickSort(nums,k,0,nums.size()-1);}privat......
  • ABC375 (A~G) 题解
    也是补完整场了。(虽然只有一题要补A模拟。B模拟。C模拟。D模拟。EE-3TeamDivision还想了蛮久的。题意:有三个队伍,各有一些人,人有能力值,人可以换队伍。问三个队伍能力值相同最少需要让多少人交换队伍。人数\(\le100\),值域\(\le1500\)题目还是挺误导人的,如......
  • [JLOI2015] 有意义的字符串 题解
    看到这个\(7\times10^{18}\)的模数已经可以摆烂了。不是,你告诉我这东西跟矩阵快速幂优化DP有关系??观察到这个题显然不能硬做,因为你显然不能直接算小数部分,而且还有个取模很难受。所以我们希望把一切的计算都基于整数。这个时候我们就要思考,有什么东西可以把根号转化为整数......
  • Codeforces Round 899 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1882A.IncreasingSequence从1开始慢慢和\(a[i]\)的所有值比较,注意最后一个位置特判下#include<iostream>#include<string.h>#include<map>#include<vector>#include<set>#include<unordered_set>#include<......
  • 带余除法题解
    题面带余除法题目背景注意:提交至洛谷时,请使用标准输入输出,而非文件输入输出。NOTICE:WhensubmittingyourcodeonLuogusite,pleaseusestandardIOinsteadoffileIO.点我(或在本题底部)下载中文试题PDF。Clickhere(oratthebottomofthispage)todownload......
  • Tarjan缩点题单 刷题题解
    Tarjan缩点可以将一个图的每个强连通分量缩成一个点,然后构建新图,该图就会变成一个有向无环图。变成有向无环图之后就能结合最短路,拓扑......解决相应题目洛谷题单分享:https://www.luogu.com.cn/training/526565前几道是绿题,没什么好写的,大致过一下1.强连通分量题目链接:https:......