Living-Dream 系列笔记 第16期

Problem

T1

/*
思路:计算出数列中每两个元素之间的绝对差,对于每个绝对差,将其与
1~n-1 依次比较,若有一个相等则将当前差标记,最后统计1~n-1是否
均被标记即可。
*/
#include<bits/stdc++.h>
using namespace std;
int n,a[1031];
bool vis[1031]; //标记数组
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++){
int c=abs(a[i]-a[i-1]); //计算绝对差
for(int j=1;j<n;j++) //依次比较
if(c==j) vis[c]=1; //标记差
}
bool f=1;
for(int i=1;i<n;i++) //检查是否均被标记
if(!vis[i]) f=0;
if(f) cout<<"Jolly";
else cout<<"Not jolly";
return 0;
}

T2

/*
思路:四重循环枚举c骰子的四个数,依次检验a->b,b->c,c->a或a->c,c->b,b->a是否成立(x->y表示x能击败y);
具体地,对于两个骰子x,y,我们循环两个骰子上的数xi和yj,一一比较,统计xi>yj的数量和yj>xi的数量,比较其大小即可。
*/
#include<bits/stdc++.h>
using namespace std;
int T;
int aa[4],bb[4],cc[4]; //a,b,c三个骰子
bool beat(int *x,int *y){ //检验x->y是否成立
int cnt1=0,cnt2=0; //计数器
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(x[i]>y[j]) cnt1++; //xi>yj
if(y[j]>x[i]) cnt2++; //yj>xi
}
return cnt1>cnt2; //若cnt1>cnt2说明能击败,否则不能
}
bool check(int *x){
if(beat(aa,bb)&&beat(bb,cc)&&beat(cc,aa)) return 1; //a->b,b->c,c->a,返回1
if(beat(aa,cc)&&beat(cc,bb)&&beat(bb,aa)) return 1; //a->c,c->b,b->a,也返回1
return 0; //否则返回0
}
string solve(){
for(int a=1;a<=10;a++) //四重循环枚举
for(int b=1;b<=10;b++)
for(int c=1;c<=10;c++)
for(int d=1;d<=10;d++){
cc[0]=a,cc[1]=b,cc[2]=c,cc[3]=d;
if(check(cc)) return "yes\n"; //只要找到一个合法的就返回yes
}
return "no\n"; //否则返回no
}
int main(){
cin>>T;
while(T--){
for(int i=0;i<4;i++) cin>>aa[i];
for(int i=0;i<4;i++) cin>>bb[i];
cout<<solve();
}
return 0;
}

T3

/*
思路:使用埃氏筛筛出2~5000内的质数表,循环m~n,
对于区间内的每一个数x在质数表中进行倒序查询,
若当前的质数pi能整除x,则将x加入数组中,
最后输出数组即可,要存到数组中是因为需要特殊处理逗号。
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,tp; //n,m,质数表大小,答案数组大小
bool v[5031]; //埃氏筛标记数组
int p[5031],pp[5031]; //质数表和答案数组
//string ans;
void Esh(){ //埃氏筛模板
for(int i=2;i<=5000;i++)
if(!v[i])
for(int j=i*i;j<=5000;j+=i) v[j]=1;
for(int i=2;i<=5000;i++)
if(!v[i]) p[++tot]=i;
}
int main(){
cin>>m>>n; //注意n,m输入顺序
Esh();
//cout<<tot<<'\n';
//for(int i=1;i<=tot;i++) cout<<p[i]<<' ';
for(int i=m;i<=n;i++){ //遍历m~n区间
for(int j=tot;j>=1;j--){ //倒序查询质数表
if(i%p[j]==0){ //若能整除i
pp[++tp]=p[j]; //存入答案数组
break;
}
}
}
for(int i=1;i<=tp;i++){
cout<<pp[i];
if(i<tp) cout<<','; //特判逗号
}
return 0;
}

T4

/*
思路:依题意模拟即可,注意需要跳过刚才被放完的歌。
*/
#include<bits/stdc++.h>
using namespace std;
int n,t;
int r[1031];
int main(){
cin>>n>>t;
for(int i=1;i<=n;i++) cin>>r[i];
for(int i=1;i<=t;i++){
int maxn=-1e9,maxid; //找权值最大的
for(int i=1;i<=n;i++)
if(maxn<r[i])
maxn=r[i],maxid=i;
cout<<maxid<<'\n'; //输出权值最大的下标
r[maxid]=0; //清零
for(int i=1;i<=n;i++) //对于不是刚才听过的歌的权值加上maxn/(n-1)
if(i!=maxid) r[i]+=maxn/(n-1);
maxn%=(n-1); //求得余数
for(int i=1;maxn;i++) //从1开始顺次将余数分配
if(i!=maxid) r[i]++,maxn--;
//for(int i=1;i<=n;i++) cout<<r[i]<<' ';
//cout<<'\n';
}
return 0;
}

T5

/*
思路:枚举不重复的三元组,对于每个三元组进行判断,若返回1则令答案累加即可;
具体地,我们对于一个三元组(x,y,z),首先枚举n个有斑点的牛,依次将列坐标为(x,y,z)的字符拼接在一起,在map中记录;
接着枚举n个无斑点的牛,同样依次将列坐标为(x,y,z)的字符拼接在一起,判断是否被记录过,若是则返回0,否则返回1。
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,num[31];
int a[531][131],b[531][131];
bool vis[31][31][31]; //标记数组
//字符矩阵,包括有斑点的牛和无斑点的牛
bool check(int x,int y,int z){ //检查三元组(x,y,z)是否合法
memset(vis,0,sizeof(vis)); //注意清空
for(int i=1;i<=n;i++)
vis[a[i][x]][a[i][y]][a[i][z]]=1;
for(int i=1;i<=n;i++)
if(vis[b[i][x]][b[i][y]][b[i][z]])
return 0;
return 1; //否则返回1
}
int main(){
cin>>n>>m;
num['A']=0,num['C']=1,num['G']=2,num['T']=3;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c; cin>>c; a[i][j]=num[c];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c; cin>>c; b[i][j]=num[c];
}
for(int i=1;i<=m;i++) //枚举三元组
for(int j=i+1;j<=m;j++)
for(int k=j+1;k<=m;k++)
if(check(i,j,k)) ans++; //若合法则累加
cout<<ans;
return 0;
}
posted @   _XOFqwq  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示