牛客上的题和蓝桥暴力杯的差不多吧。。。。模拟,要考虑各种情况
1.
20亿大小,int都没超附上速查表,int 21亿多
傻逼了,还用字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { // freopen("in.txt","r",stdin); char str[15]; while(~scanf("%s",str)) { int sum = 1; int cnt = 0; int len = strlen(str); if(len==1) { cout<<0<<endl; return 0; } for(int i = 0; i < len; i++) { int t = str[i]-'0'; sum*=t; } cnt++ ; int tmp = 1; int flag = 0; while(sum>10) { tmp = 1; while(sum>0) { int t = sum%10; tmp *= t; sum /= 10; } sum = tmp; cnt++; } cout<<cnt<<endl; } return 0; }
2.
一开始质数的范围判断有问题,应该到sqrt(n),包括这个数,下面判断就在+1的位置了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; bool IsPrime(int n){ int i; int dd = sqrt(n*1.0); for(i = 2; i <= dd; i++){ if(n%i==0) break; } if(i==dd+1) return true; else return false; } int d[20]; int main() { // freopen("in.txt","r",stdin); int a,b; while(~scanf("%d%d",&a,&b)) { int sum = 0; for(int k = a; k <=b; k++){ int num = 0; int tt = k; while(tt>0) { int t = tt%10; if(t!=0) { d[num++] = t; } tt /= 10; } int flag = 0; int tmp; for(int i = 0; i < num; i++) { if(flag) break; for(int j = 0; j < num; j++) { if(i==j) continue; tmp = d[i]*10+d[j]; if(IsPrime(tmp)) { sum++; flag = 1; break; } } } } cout<<sum<<endl; } }
3.
思路就是找出当前匹配串的重合最大值,然后其他长度差值都可以满足重合。记得一维的循环是在不超过原串的长度匹配,dif是差值+1的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int main() { // freopen("in.txt","r",stdin); char str[55]; char sub[55]; while(~scanf("%s%s",sub,str)) { int Max = 0; int len = strlen(str); int d = strlen(sub); int dif = len - d + 1; for(int i = 0; i < dif; i++) { int cur = i; int cnt = 0; for(int j = 0; j < d; j++) { if(sub[j]==str[cur]) { cnt++; } cur++; } Max = max(Max,cnt); } int ans = len-(len-d+Max); cout<<ans<<endl; } }
4.
思路:排序后大数除小数,商必须要是2的倍数,或者为1才行,注意在IsTrue必须要有一个返回值在判断条件外面。否则牛客的OJ会报错
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int a[55]; bool Istrue(int n) { if(n==1) return true; while(n>0) { if(n%2==0) { n/=2; if(n==1) { return true; } }else { return false; } } return false; } int main() { // freopen("in.txt","r",stdin); int n; while(~scanf("%d",&n)) { for(int i = 0; i < n; i++) { cin>>a[i]; } sort(a,a+n); int flag = 0; for(int i = 0; i < n; i++) { if(flag) break; for(int j = i+1; j < n; j++) { int t = a[j]/a[i]; double t2 = a[j]*1.0/a[i]*1.0; if(t2-t>0) { flag = 1; break; } if(Istrue(t)) continue; else { flag = 1; break; } } } cout<<(flag?"NO":"YES")<<endl; } return 0; }
5.
刚开始的思路是找出凸包和凹包,即找出分界点,最后ans++,后来提交还是有问题。比如1212121,132435,像这样的相邻的序列如果是同种顺序的排列,上一个序列的结束点和新序列的开始点都会是一个分割点。所以还是要用几个标记来严格特殊评判下。
新思路就是要声明三个标记,每段的序列的开始flag=0,序列的开始ans不自加,这就解决了上面的问题。然后比较序列的第二个,递增则标记1,递减则2,后面相等的和同顺序的就不用管,直到找到在1的情况的递减和2的情况的递减,然后把这个数置为新序列的开始点,flag=0。
注意相等根据题意就不要管了,不能改变标记的状态。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; typedef long long ll; int a[100000+10]; int main() { // freopen("in.txt","r",stdin); int n; while(~scanf("%d",&n)) { int ans = 0; for(int i = 0; i < n; i++) { cin>>a[i]; } int flag = 0; int pre = a[0]; for(int i = 1; i < n; i++) { int cur = a[i]; //一段序列的开始 if(flag==0) { //递增序列 if(cur>pre) { flag = 1; } //递减序列 else if(cur < pre) { flag = 2; } } else if(flag==1) { if(cur<pre) { ans++; flag = 0;//这段序列结束了 } } else if(flag==2) { if(cur>pre) { ans++; flag = 0; } } pre = cur; } cout<<++ans<<endl; } return 0; }
6.
位置就是排序后,第一个人和倒着的两个人组队,依次这样,其实中间这个人的位置就在这个排序后的序列有位置了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstring> #include <stdio.h> #include <stdlib.h> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 100000+10; int a[maxn*3+10]; int main() { int n; // freopen("in.txt","r",stdin); while(cin>>n) { int len = 3*n; for(int i = 0; i < len; i++) { cin>>a[i]; } sort(a,a+len); ll sum = 0; for(int i = 1; i <= n; i++) { int pos = len-i*2; sum += a[pos]; } cout<<sum<<endl; } }