首页 > 其他分享 >【比赛】暑假集训CSP提高模拟1

【比赛】暑假集训CSP提高模拟1

时间:2024-07-18 17:30:06浏览次数:14  
标签:&& int else 集训 lst 暑假 ans now CSP

T1 Start 10Pts

题面(较长)

大模拟。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=INT_MAX;
string nm[10]={"","D","B","A","C","E","PASS","TURN","DOUBLE"};
string nmm[10]={"","C","A","B","D","E","PASS","TURN","DOUBLE"};
struct card{
	string name;
	int num;
	void input(){
		string s;
		cin>>s;
		if(s!="PASS"&&s!="TURN"&&s!="DOUBLE"){
			name=s[0];
			int x=0;
			for(int i=1;i<(int)s.size();i++){
				x=(x<<3)+(x<<1)+(s[i]^48);
			}
			num=x;
		}
		else name=s,num=0;
	}
};
struct player{
	string name;
	card c[5];
	int nxt,pre;
}a[10];
int n,m,k,p,now,minn,miid;
queue<card> q;
card tmp;
bool db;
int playbig(int x,int p){
	int maxn=-inf,id=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=3;j++){
			tmp=a[x].c[j];
			if(tmp.name==nmm[i]){
				int to=p;
				if(i==1)to*=tmp.num;
				else if(i==2)to+=tmp.num;
				else if(i==3)to-=tmp.num;
				else if(i==4)to>>=1;
				else if(i==5)to=tmp.num;
				if(to>99)continue;
				if(to>maxn){
					maxn=to;
					id=j;
				}
			}
		}
	}
	if(id){
		tmp=q.front();
		q.pop();
		cout<<a[x].name<<" used "<<a[x].c[id].name<<a[x].c[id].num<<",now p="<<maxn<<".\n";
		a[x].c[id]=tmp;
		return maxn;
	}
	for(int i=6;i<=8;i++){
		for(int j=1;j<=3;j++){
			tmp=a[x].c[j];
			if(tmp.name==nmm[i]){
				if(i==6){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					return p+1e6;
				}
				else if(i==7){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					for(int k=1;k<=n;k++){
						swap(a[k].nxt,a[k].pre);
					}
					return p+1e6;
				}
				else if(i==8){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					db=1;
					return p+1e6;
				}
			}
		}
	}
	cout<<a[x].name<<" lost the game.\n";
	return 100;
}
int playsmall(int x,int p){
	int minn=inf,id=0;
	for(int i=6;i<=8;i++){
		for(int j=1;j<=3;j++){
			tmp=a[x].c[j];
			if(tmp.name==nm[i]){
				if(i==6){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					return p+1e6;
				}
				else if(i==7){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					for(int k=1;k<=n;k++){
						swap(a[k].nxt,a[k].pre);
					}
					return p+1e6;
				}
				else if(i==8){
					card tmpp=q.front();
					q.pop();
					cout<<a[x].name<<" used "<<a[x].c[j].name<<",now p="<<p<<".\n";
					a[x].c[j]=tmpp;
					db=1;
					return p+1e6;
				}
			}
		}
	}
	for(int i=1;i<=5;i++){
		for(int j=1;j<=3;j++){
			tmp=a[x].c[j];
			if(tmp.name==nm[i]){
				int to=p;
				if(i==1)to>>=1;
				else if(i==2)to-=tmp.num;
				else if(i==3)to+=tmp.num;
				else if(i==4)to*=tmp.num;
				else if(i==5)to=tmp.num;
				if(to>99)continue;
				if(to<minn){
					minn=to;
					id=j;
				}
			}
		}
	}
	if(id){
		tmp=q.front();
		q.pop();
		cout<<a[x].name<<" used "<<a[x].c[id].name<<a[x].c[id].num<<",now p="<<minn<<".\n";
		a[x].c[id]=tmp;
		return minn;
	}
	cout<<a[x].name<<" lost the game.\n";
	return 100;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i].name;
		for(int j=1;j<=3;j++){
			a[i].c[j].input();
		}
		a[i].nxt=i==n?1:i+1;
		a[i].pre=i==1?n:i-1;
	}
	while(k--){
		tmp.input();
		q.push(tmp);
	}
	now=1;
	for(int t=1;t<=m;t++){
		cout<<"Round "<<t<<":\n";
		for(int i=1;i<=n;i++){
			a[i].nxt=i==n?1:i+1;
			a[i].pre=i==1?n:i-1;
		}
		p=db=0;
		while(1){
			if(db){
				p=playsmall(now,p);
				if(p>=1e4){
					p=p-1e6;
					now=a[now].nxt;
					continue;
				}
				if(p==100)break;
				db=0;
			}
			p=playbig(now,p);
			if(p>=1e4)p=p-1e6;
			if(p==100){
				break;
			}
			now=a[now].nxt;
		}
		for(int i=1;i<=3;i++){
			tmp=q.front();
			q.pop();
			a[now].c[i]=tmp;
		}
	}
	return 0;
}

主体思路是对的,但是犯了不少错导致只有 \(10\) 分。

  • 没考虑负数 \((|p| \le 10^4)\)
  • \(\texttt{double}\) 标记未置零
  • 要求向下取整,但 c++ 中的除法是向 \(0\) 取整
  • 每轮新开始时没重置方向

这已经不能算挂分了。

T2 mine 0Pts

原题 Minesweeper 1D

一道分讨 DP,但赛时没想出来,直接记搜了。
然后发现这个新 · 学校题库开不了 \(10^6 \times 6 \times 6\) 的数组,会 RE。
但开成 \(10^6 \times 5 \times 5\) 就过了。
幽默网站。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
const int mod=1e9+7;
string s;
int n;
int f[N][5][5];
int dfs(int x,int lst,int llst){
	if(x==n+1){
		int ans=1;
		if(lst==1&&llst!=3)ans=0;
		else if(lst==2)ans=0;
		else if(lst==0&&llst==3)ans=0;
		return f[x][lst][llst]=ans;
	}
	if(f[x][lst][llst]!=-1)return f[x][lst][llst];
	if(x==0){
		int now;
		if(x==0)now=4;
		else now=(s[x-1]=='*'?3:s[x-1]-'0');
		int ans;
		if(now==0&&lst==3)ans=0;
		else if(now==1&&x==n&&lst!=3)ans=0;
		else if(now==2&&lst!=3)ans=0;
		else if(now==3&&lst==1&&llst==3)ans=0;
		else if(now==3&&lst==0)ans=0;
		else if(now!=3&&lst==1&&llst!=3)ans=0;
		else if((now!=3||llst!=3)&&lst==2)ans=0;
		else ans=dfs(x+1,now,lst);
		return f[x][lst][llst]=ans;
	}
	else if(s[x-1]!='?'){
		int now;
		if(x==0)now=4;
		else now=(s[x-1]=='*'?3:s[x-1]-'0');
		int ans;
		if(now==0&&lst==3)ans=0;
		else if(now==1&&x==n&&lst!=3)ans=0;
		else if(now==2&&lst!=3)ans=0;
		else if(now==3&&lst==1&&llst==3)ans=0;
		else if(now==3&&lst==0)ans=0;
		else if(now!=3&&lst==1&&llst!=3)ans=0;
		else if((now!=3||llst!=3)&&lst==2)ans=0;
		else ans=dfs(x+1,now,lst);
		return f[x][lst][llst]=ans;
	}
	int ans=0;
	if(lst==3){
		for(int i=1;i<=3;i++)ans=(ans+dfs(x+1,i,lst))%mod;
	}
	else if(lst==0){
		ans=(dfs(x+1,1,lst)+dfs(x+1,0,lst))%mod;
	}
	else if(lst==1){
		if(llst==3)ans=(dfs(x+1,0,lst)+dfs(x+1,1,lst))%mod;
		else ans=dfs(x+1,3,lst);
	}
	else if(lst==2){
		ans=dfs(x+1,3,lst);
	}
	else ans=(dfs(x+1,0,lst)+dfs(x+1,1,lst)+dfs(x+1,3,lst))%mod;
	return f[x][lst][llst]=ans%mod;
}
int main(){
	memset(f,-1,sizeof(f));
	cin>>s;
	n=s.size();
	cout<<dfs(0,0,0);
	return 0;	
}

T3 小凯的疑惑 100Pts

题面

数学题,大力手玩找规律推式子即可。
最后结论是:若 \(n\),\(m\) 不互质为 \(-1\),否则为 \(\frac{(n-1)\times(m-1)}{2}\)。
不过 \(O(n)\) 也能过 \(10^8\),没多测导致的。
赛时直接手模出了最终式。

更详细的推式子

点击查看代码
#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
int x,y;
main(){
	cin>>x>>y;
	if(x>y)swap(x,y);
	if(x==1||y==1)return cout<<0,0;
	if(__gcd(x,y)!=1)return cout<<-1,0;
	cout<<(x-1)*(y-1)/2;
	return 0;
}

T4 春节十二响 100Pts

原题 春节十二响

由于选出的数不能存在祖先关系,所以每一“条”上最多选一个;
显然,我们应该把最大的一堆放在一起,然后是次大的,以此类推。
这是一个自底向上的过程,一次 DFS 就解决了。
注意要用启发式合并降至 \(O(n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,a[N],fa[N];
priority_queue<int> q[N];
struct edge{
	int next,to;
}e[N*2];
int h[N],cnt;
void add(int u,int v){
	e[++cnt]={h[u],v};
	h[u]=cnt;
}
void merge(int x,int y){
	if(q[x].size()>q[y].size())swap(q[x],q[y]);
	while(!q[x].empty()){
		int a=q[x].top(),b=q[y].top();
		q[x].pop();q[y].pop();
		q[0].push(max(a,b));
	}
	while(!q[0].empty()){
		q[y].push(q[0].top());
		q[0].pop();
	}
}
void dfs(int x){
	for(int i=h[x];i;i=e[i].next){
		int to=e[i].to;
		dfs(to);
		merge(to,x);
	}
	q[x].push(a[x]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=2;i<=n;i++){
		cin>>fa[i];
		add(fa[i],i);
	}
	dfs(1);
	ll ans=0;
	while(!q[1].empty()){
		ans+=q[1].top();
		q[1].pop();
	}
	cout<<ans;
	return 0;
}

标签:&&,int,else,集训,lst,暑假,ans,now,CSP
From: https://www.cnblogs.com/LBTL/p/18310082

相关文章

  • 2023HACSP-J补测
    都快忘了自己还打过这个比赛了,所以来补一下。完整题目在这里查看。Day0来到郑州,寻找考场。幸好提前来了,因为考场大门就5m宽(HA用不用这么穷啊喂,来JZYZ不好么),开车转了20min才找到。旅馆离考场很近,走路就能到。和zjyDALAO住隔壁,晚上去他那里写了一会题就去睡了。Day1早上......
  • 2024 暑假集训杂题选做
    目录写在前面CF1981DCF1992F写在最后写在前面我是飞物。CF1981D2400妈的好诡异的题场上拿到这题我都不知道我要干啥呃呃考虑到每个合数均为若干质数的乘积,则若构造方案中有合数,可以将合数替换为质数从而减少使用的权值的种类数,于是仅需考虑使用质数构造,则此时并不需要考虑具......
  • 【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业
    目录1项目功能2项目介绍3项目地址1项目功能【java计算机毕设】网上购书管理系统MySQLservletJSP项目设计源代码期末寒暑假作业小组作业 2项目介绍系统功能:servlet网上购书管理系统包括管理员、用户两种角色。管理员功能包括订单管理(已处理,未处理),顾客管理(添......
  • 2024信友队蓝润暑期集训提高1班②Day6
    知识总结拓扑排序给定一个有向图,找到一个拓扑排序,使得图中所有顶点都在拓扑排序中出现,且任意两个相邻顶点间都有路径相连。算法:找到入度为0的顶点,加入拓扑排序序列。对于剩余的顶点,如果其入度为0,则加入拓扑排序序列;否则,将其所有入边的顶点的入度减1。重复步骤2,直到所......
  • 暑假Java自学每日进度总结1
    今日所学:一.常用的cmd命令:1>盘符:2>dir(显示当前文件所有目录)3>cd目录(打开该目录)4>cd..(回到上一目录)5>cd(回到当前盘符初始态)6>cls(清屏)7>exit(退出cmd命令界面)8>cd目录1\目录2...(打开多级目录)二.创建用cmd打开软件的快捷方式:使用环境变量:1>电脑2>属性3>高......
  • 2024QBXT暑假j组精英营Day2
    \(一\)\(数据结构\)\(1\)\(链表\)\(1.0\)\(介绍\)链表分为单向链表和双向链表单向链表即当前链表只指向下一个元素双向链表即对于每个元素,记录其前面一个元素,也记录其后面一个元素。链表不建议使用STL的某些元素进行替代,手写链表更为方便。\(1.1\)\(单向链表\)\(1.......
  • 喜欢dp动态规划的第二天(暑假提升)
    不要失去信心,只要坚持不懈,就终会有成果。——钱学森dp动态规划题目详解--第二天前言1、最长定差子序列2、最长等差数列3、等差数列划分II-子序列4、回文子串5、总结前言由于上一期的动态规划我觉的太过于繁琐,所以这次简化一下操作,题目概念解析将不会再写,我直......
  • 暑期集训shellcode5(手搓机器码)
    拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码)#include<string.h>#include<stdio.h>#include<stdlib.h>#include<inttypes.h>#include<capstone/capstone.h>#include<sys/mman.h>intupkeep(){setvbuf(stdin,NULL,_IONB......
  • 2024信友队蓝润暑期集训提高1班②Day1
    知识总结原理:每一步都采取局部最优解,取到最终的最优解。常见时间复杂度$O(n)$或$O(nlog(n))$后者一般带排序。用法:通过数据规模和题目信息联想贪心算法常见时间复杂度猜测结论验证合理性​-归纳法​-反证法(相邻交换法):如果交换方案中相邻的两个元素/任意......
  • 2024信友队蓝润暑期集训提高1班②Day0
    前言去年参加了杭师大的暑期集训,那时候还是普及1班①的小萌新,转眼间,现在已经在读提高组的知识了。这一次的安吉似乎景色更加优美。9:30从绍兴出发12:00到达安吉13:00吃中饭14:00在教室刷题、打比赛(当然也有部分时间在摸鱼)18:00吃晚饭19:00去大报告厅看开营仪式。......