天梯赛团体选拔赛题解

一、老头环

 书被还回来后并不是直接就放在了书架上,而是放在了例如桌子上,然后等待操作1再将其方法哦书架上去;

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node{
	int flag=0;//1表示被借走 
	int line;//所在行数 
}a[N];
struct point{
	int lock;//是否上锁,0没锁,1上锁
	set<int>book;//每一行的书	
}b[N];//每行的状态
int main()
{
	int i,j;
	int n,m,q;cin>>n>>m>>q;
	while(q--){
		int id;cin>>id;
		int x,y;
		if(id==1){
			cin>>x>>y;
			if(a[x].flag||b[a[x].line].lock==1||b[y].lock==1){
			//本来就在书架上则不需要重新摆放
			//本来就在书架上然后该行上锁的话则不需要重新摆放
			//该书不在书架上但是该行上锁则不能放上去 
				continue;
			}
			b[y].book.insert(x);//第y行放入了这本书 
			a[x].line=y; //这本书放在了第y行 
		}
		else if(id==2){
			cin>>y;
			b[y].lock = 1;//上锁 
		}
		else if(id==3){
			cin>>y;
			b[y].lock = 0;//解锁 
		}
		else if(id==4){//来借书 
			cin>>x;
			if(a[x].flag||b[a[x].line].lock||a[x].line==0){
			//a[x].flag==1表示已经被节奏了
			//想借的哪本书所在行被上锁了也不能借
			//a[x].line==0表示不在书架上,要么是已经被接走了要么是在桌子上等待操作1将它放在书架上 
				cout<<"-1\n";
			}else{
				cout<<a[x].line<<"\n";
				a[x].flag = 1;//被借走 
				a[x].line = 0;//被借走后
				b[a[x].line].book.erase(x); 
			}
		}
		else if(id==5){
			cin>>x;
			if(a[x].flag!=0){
				a[x].flag = 0;//归还
				a[x].line = 0;//归还了但还没放到书架上
				//可以想象成还了但只是放在了桌子上,等待操作1放到书架上 
			}
		}
	}	
} 

 二、不要赌博

 

利用权值算出每种组合,再将其转换成数值比较。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define ll long long
int cal()
{
	int a[3];
	for(int i=0;i<3;i++) cin>>a[i];
	sort(a,a+3,greater<int>());
	//为每一种赋值
	const int A=1e4,B=1e3,C=1e2,D=1e1,E=1e0;
	if(a[0]==a[2]){
		return a[0]*A;//豹子 
	}
	else if(a[0]==a[1]){
		 return a[0]*B+a[2];//对子 
	} 
	else if(a[1]==a[2]){
		return a[1]*B+a[0];//对子 
	}
	return a[0]*C+a[1]*D+a[2]*E;//转换成数量 
}
int main()
{
	int n;cin>>n;
	while(n--){
		int tom_val = cal();
		int jerry_val = cal();
		if(tom_val==jerry_val){
			cout<<"Draw!!!\n";
		}
		else{
			printf("%s\n",tom_val>jerry_val?"Tom Win!!!":"Jerry Win!!!");	
		}
	}
}

 三、卷王

 

通过先统计每个位置的查询次数,根据贪心的思想,将最大的数放在查询位置最多的地方,在统计
过程中,我们就可以将要加到区间上的数算出来,并加
中,最后两个排序然后进行运算输出即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
int a[N],cnt[N],nw[N];
int main()
{
	int n,m;cin>>n>>m;
	int i,j;
	for(i = 1;i <= n; i++){
		cin>>a[i];
	}
	ll ans = 0;
	while(m--){
		int id,l,r,k;
		cin>>id;
		if(id==1){
			cin>>l>>r;
			for(i = l;i <= r; i++){
				ans+=nw[i];//把可以加的操作2加上的值给加上 
				cnt[i]++;//每个点被查询了多少次 
			}
		}else{
			cin>>l>>r>>k;
			for(i = l;i <= r; i++){
				nw[i]+=k;
			}
		}
	}
	sort(cnt+1,cnt+n+1);
	sort(a+1,a+1+n);
	for(i = 1;i <= n; i++){
		ans+=a[i]*cnt[i];
	}	
	cout<<ans<<"\n";
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值