给定四个字符,判断是否其中有三个相同,另一个与他们不同
- #include
- void solve()
- {
- std::string s;
- std::cin>>s;
- char a=s[0],b=s[1],c=s[2],d=s[3];
- if(a==b&&a==c&&a!=d) std::cout<<"Yes"<<'\n';
- else if(a==b&&a==d&&a!=c) std::cout<<"Yes"<<'\n';
- else if(a==d&&a==c&&a!=b) std::cout<<"Yes"<<'\n';
- else if(d==b&&d==c&&a!=d) std::cout<<"Yes"<<'\n';
- else std::cout<<"No"<<'\n';
- }
- signed main()
- {
- int t;
- std::cin>>t;
- while(t--)
- {
- solve();
- }
- return 0;
- }
二叉树性质问题,不了解二叉树也完全可以做。
要注意的是每次都从第一行的第一个点开始走,给一个字符串按照它走,输出最后的结果就行。
往左走坐标就变成了2*pos-1,往右就变成了2*pos
画个树理解一下就好了。
- #include
-
- signed main()
- {
- int n,q;
- std::cin>>n>>q;
- int pos=1;
- while(q--)
- {
- pos=1;
- std::string s;
- std::cin>>s;
- int i=0;
- while(s[i])
- {
- if(s[i]=='L')
- {
- pos=2*pos-1;
- }else if(s[i]=='R'){
- pos*=2;
- }
- i++;
- }
- std::cout<
'\n'; - }
-
- return 0;
- }
这题要求最大的极差最小。【二分答案题目整理】—— 最大化最小值 + 最大值最小化(上)_现在小红有一只木桶由 n 块木板组成,第 i 块木板的长度为 ai 。 现在你有一种魔法-CSDN博客
思维固化导致想不出二分,需要专门刷下二分了。。。。。
二分极差,然后判断如果以该极差来分组,所分的组数能否小于k(如果小于k,那么k肯定能满足。因为一个数可以单独成一组,即极差为0),如果能就减小极差继续试探,否则增大极差。
- #include
- const int N=1e5+10;
- int a[N];
- int n,k;
-
- bool check(int x)
- {
- int last=1,cnt=1;
- for(int i=1;i<=n;i++)
- {
- if(a[i]-a[last]>x)//如果当前这个不行就分组
- {
- last=i;
- cnt++;
- }
- }
- return cnt<=k;
- }
- signed main()
- {
- std::cin>>n>>k;
-
- for(int i=1;i<=n;i++) std::cin>>a[i];
- std::sort(a+1,a+1+n);
-
- int l=0,r=2e9,res=0;//枚举极差
- while(l<=r)
- {
- int mid=l+r>>1;
- if(check(mid))
- {
- res=mid;
- r=mid-1;
- }else l=mid+1;
- }
- std::cout<
- return 0;
- }
健身【算法赛】 - 蓝桥云课 (lanqiao.cn)
十年OI一场空,不开longlong见祖宗。
这道题是一个完全背包问题,需要注意的是si范围是1e9,不开longlong会死。
首先dp预处理出 对应连续天数 能收获的最大分数。
然后对连续天数进行计算,每算出一个连续天数就加上对应的分数。
- #include
- const int N=2e5+10;
- #define int long long
- int n,m,q;
- int cantuse[N],k[N],s[N];
- struct st{
- int k,s;
- }a[N];
- int res,cnt;
- int f[N];
- #define int long long
- void solve()//有i天怎么用最大化
- {
- for(int i=1;i<=m;i++)//对物品遍历
- {
- for(int j=a[i].k;j<=n;j++)//对容积遍历
- {
- f[j]=std::max(f[j],f[j-a[i].k]+a[i].s);
- }
- }
- }
- signed main()
- {
- std::cin>>n>>m>>q;
- for(int i=1;i<=q;i++)
- {
- int d;
- std::cin>>d;
- cantuse[d]=1;
- }
- for(int i=1;i<=m;i++)
- {
- std::cin>>a[i].k>>a[i].s;
- a[i].k=pow(2,a[i].k);
- }
- solve();
- f[0]=0;
- for(int i=1;i<=n;i++)
- {
- if(!cantuse[i]) cnt++;
- else{
- res+=f[cnt];
- cnt=0;
- }
- }
- if(cnt) res+=f[cnt];
- std::cout<
- return 0;
- }
契合匹配【算法赛】 - 蓝桥云课 (lanqiao.cn)
这题注意两个点,提前把一个字符串反转(大写改小写,小写改大写),剩下就只用判断是否子串就好了。
同时这题涉及到顺逆时针旋转的问题,我们只要让a=a+a,就能满足a顺逆时针旋转的情况。
- #include
- const int N = 1e6 + 10;
- int n, ne[N];
- std::string a, b;
- void kmp()
- {
- for(int i=2,j=0;i<=n;i++)
- {
- while (j&&b[i]!=b[j+1]) j=ne[j];
- if(b[i]==b[j+1]) j++;
- ne[i]=j;
- }
- for (int i=1,j=0;i<=2*n;i++)
- {
- while(j&&a[i]!=b[j+1]) j=ne[j];
- if (a[i]==b[j+1]) j++;
-
- if(j==n)
- {
- std::cout<<"Yes\n"<
min((i-n),(2*n-i)); - return ;
- }
- }
- std::cout<<"No";
- }
- void solve()
- {
- std::cin >> n >> a >> b;
- a=" "+a+a;
- b=" "+b;
-
- for(int i=1; i <=n; i++)
- {
- if (isupper(b[i])) b[i] = tolower(b[i]);
- else b[i] = toupper(b[i]);
- }
- kmp();
- }
- signed main()
- {
- std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
- solve();
- return 0;
- }
奇怪的线段【算法赛】 - 蓝桥云课 (lanqiao.cn)
这题似乎要用树状数组,博主还没学过,留个坑。
-
相关阅读:
今天给大家介绍一篇基于javaWeb的汽车订票系统的设计与实现
Google Earth Engine 教程—— 数据的相关分析时序图展示
MyBatis 缓存
【李沐深度学习笔记】矩阵计算(5)
leetcode算法每天一题026:删除有序数组中的重复项
Spring中@Bean标注的方法是如何创建对象呢?
移动机器人建模两轮驱动与四轮驱动
Java 解析线程的几种状态详解
计算机操作系统 (第四版 汤小丹)(持续学习中)
企业是如何搭建帮助中心的?
-
原文地址:https://blog.csdn.net/m0_74183164/article/details/133830330