2019 ACM训练计划——( 每天5题 ) 训练计划20 【gcd求等差数列公差 + strstr函数判断字符串子串】
发布日期:2021-06-29 14:26:28
浏览次数:2
分类:技术文章
本文共 2813 字,大约阅读时间需要 9 分钟。
A
题目大意
题目意思是找到一个大于等于n的数,并且越小越好 然后满足那个数是由3的幂求和得到的 注意3的幂次只能存在一个
题解
解法一:递归求解
#includeusing namespace std;int t,n;int f(int x){ if(x==0) return 1; if(x%3>1) return 0; return f(x/3);}int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){ cin>>n; while(!f(n)) ++n; cout< <
解法二:贪心求解
#includeusing namespace std;const int maxn=1e4+10;int t,n;int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){ cin>>n; int nn=n; int cnt=0; while(nn!=0){ nn/=3; cnt++; } int sum=0; for(int i=cnt;i>=0;i--) sum+=pow(3,i); for(int i=cnt;i>=0;i--){ if(sum-pow(3,i)>=n) sum-=pow(3,i); } cout< <
B
题目大意
n个学生 分别有不同的编程技能,然后编程技能之间差值等于1的两个同学不能处于同一团队 问这些学生的最小团队
题解
math
排序,然后遍历一遍,判断是否存在两个同学的编程技能相差为1,如果存在的话那就是两个团队 如果不存在差值为1的话,那就所有同学处于一个团队中
#include#define endl '\n'using namespace std;const int maxn=1000;int a[maxn],n,t,cnt=0;int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){ cnt=0; cin>>n; for(int i=0;i >a[i]; sort(a,a+n); for(int i=0;i
C
题目大意
给你n个字符串 问你最大的位置:当前位置以前存在一种情况 不是当前字符串的子串
题解
strstr函数很方便 用来判断字符串子串问题 都可以用这函数使用
#includeusing namespace std;int t,n;const int maxn=2019;char s[520][maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>t; int k=0; while(t--){ cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; int ans=-1; for(int i=n;i>=2;i--){ if(!strstr(s[i],s[i-1])){ ans=max(ans,i); for(int j=i+1;j<=n;j++){ if(!strstr(s[j],s[i-1])) ans=max(ans,j); } } } cout<<"Case #"<<++k<<": "; if(ans==-1) cout<<-1<
D
题目大意
给定n个位置(1 — n),每个位置只能建造一个塔。现在位置a和b已经建好了塔,已知每次可以新建塔的前提——能够找到两个塔j和k使得 i = j-k || i = j+k。 现在给出一个博弈局面,当某个人不能再建造塔时为输。问你谁能赢。
题解
当且仅当 a和b处于某个等差数列(差值不为1)时,才无法使得所有位置都建上塔。相反,则n个位置均可建塔。等差数列的差值 d = gcd(a, b),求出可以建塔的个数就可以了
#includeusing namespace std;int t,n,a,b;int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>t; int k=0; while(t--){ cout<<"Case #"<<++k<<": "; cin>>n>>a>>b; int t=gcd(a,b); t=n/t-2; if(t&1) cout<<"Yuwgna"<
E
题目大意
求让三个人汇集的最短距离
题解
水题
排序,找中间值,然后求相差的绝对值之和即可
#includeusing namespace std;int a[5];int main(){ cin>>a[0]>>a[1]>>a[2]; sort(a,a+3); cout<<(int)abs(a[1]-a[0])+(int)abs(a[1]-a[2])<
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/102682167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月06日 16时39分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ABAQUS复合材料(适合小白)
2019-04-29
ABAQUS高级案例解析
2019-04-29
人工智能药物研发
2019-04-29
【超级干货+福利】AIDD最全面的学习教程
2019-04-29
最新通知:AIDD与网络药理学资料大全
2019-04-29
Lammps分子动力学与第一性原理材料模拟及催化
2019-04-29
实习生小白的日常
2019-04-29
实习小白的日常(3)
2019-04-29
实习小白的日常(4)
2019-04-29
APP页面布局参考
2019-04-29
linux 的 Socket IO 模型
2019-04-29
APP调用服务器API设计
2019-04-29
Opencv+Zbar二维码识别(标准条形码/二维码识别)
2019-04-29
zbar优化
2019-04-29
微信扫码登录验证PHP代码(不用开放平台)
2019-04-29
CH554E USB单片机 10引脚小封装低成本USB方案
2019-04-29
windows MQTT客户端
2019-04-29
LINUX下挂载(mount)查看树莓派镜像文件
2019-04-29
基于CH568芯片加密SD卡方案
2019-04-29