2019 ACM训练计划——( 每天5题 ) 训练计划20 【gcd求等差数列公差 + strstr函数判断字符串子串】
发布日期:2021-06-29 14:26:28 浏览次数:2 分类:技术文章

本文共 2813 字,大约阅读时间需要 9 分钟。

A


题目大意

题目意思是找到一个大于等于n的数,并且越小越好 然后满足那个数是由3的幂求和得到的 注意3的幂次只能存在一个


题解

解法一:递归求解

#include
using 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<
<

解法二:贪心求解

#include
using 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函数很方便 用来判断字符串子串问题 都可以用这函数使用

#include
using 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),求出可以建塔的个数就可以了

#include
using 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


题目大意

求让三个人汇集的最短距离


题解

水题

排序,找中间值,然后求相差的绝对值之和即可

#include
using 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Codeforces Round #595 (Div. 3), problem: (C1) Good Numbers (easy version) 【贪心+递归求解两种方式】
下一篇:Codeforces Beta Round #26 (Codeforces format), problem: (A) Almost Prime 【数组判断几乎素数】

发表评论

最新留言

很好
[***.229.124.182]2024年04月06日 16时39分04秒