一、老头环
书被还回来后并不是直接就放在了书架上,而是放在了例如桌子上,然后等待操作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";
}