A 翻滚吧牛牛(一)
每种翻滚的长度都可以直接求出来的 直接遍历就是了
class Solution { public: const double PI = acos(-1); double circumference(int k) { double r[]={1,sqrt(3),2,sqrt(3),1}; double res=0; for(int i=0;i<k;i++){ res+=2.0*PI*r[i%6]/6.0; } return res; } };
B 牛牛的分配
先全部累加计算平均分配行不行 不行再一个个踢出最少的
int solve(int n, int x, vector<int>& a) { // write code here long long ans=0; for(int i=0;i<n;++i) { ans+=a[i]; } sort(a.begin(),a.end()); int k=n; for(int i=0;i<n;++i) { if((ans/k)<x) {ans-=a[i];k--;} else break; } return k; } };
C 牛牛构造等差数列
计算9种开头情况 在计算等差和遍历统计
#define ll long long int solve(int n, vector<int>& b) { if(b.size()<=2)return 0; int ans=b.size()+1; for(int i=-1; i<=1;++i) for(int j=-1;j<=1;++j) { int p=b[0]+i, q=b[1]+j,d=q-p,cnt=!!i+!!j; for(int k=2;k<b.size();++k) { ll r=k*d+p; if(abs(r-b[k])<=1)cnt+=!!abs(r - b[k]);/// 1 -1 加1 0 不加 else cnt=1e9; } ans=min(ans,cnt); } if(ans==b.size()+1) return -1; else return ans; } };
D playfair
照着题意硬模拟(感谢学长提供的代码
class Solution { public: /** * playfair加密算法 * @param key string字符串 密钥 * @param str string字符串 明文 * @return string字符串 */ bool vis[200]; int Map[10][10]; string s = ""; pair<int,int> p[30]; string Encode(string key, string str) { memset(vis,0,sizeof(vis)); memset(Map,0,sizeof(Map)); int Len1 = key.size(), Len2 = str.size(), Len3 = 0; for(int i=0;i<Len2;i++) if( str[i] == 'j' ) str[i] = 'i'; for(int i=0;i<Len1;i++) { if( key[i] == 'j' ) key[i] = 'i'; if( vis[key[i]-'a'] ) continue; s += key[i]; Len3 ++; vis[key[i]-'a'] = true; } int x=0,y=0; for(int i=0;i<Len3;i++) { Map[x][y] = s[i]-'a'; y++; if( y == 5 ) y = 0, x++; } for(int i=0;i<26;i++) { if( vis[i] || i+'a' == 'j' ) continue; Map[x][y] = i; y++; if( y == 5 ) y = 0, x++; } string ans = ""; for(int i=0;i<5;i++,cout<<endl) for(int j=0;j<5;j++) p[Map[i][j]] = make_pair(i,j); for(int i=0;i+1<Len2;i+=2) { int a = str[i] - 'a', b = str[i+1] - 'a'; int x,y; if( a == b ) ans += str[i], ans += str[i+1]; else if( p[a].first == p[b].first ) { x = p[a].first; ans += (Map[x][ (p[a].second+1)%5 ] + 'a'); ans += (Map[x][ (p[b].second+1)%5 ] + 'a'); } else if( p[a].second == p[b].second ) { y = p[b].second; ans += (Map[ (p[a].first+1)%5 ][y] + 'a'); ans += (Map[ (p[b].first+1)%5 ][y] + 'a'); } else { ans += (Map[ p[a].first ][ p[b].second ] + 'a'); ans += (Map[ p[b].first ][ p[a].second ] + 'a'); } } if( Len2%2 != 0 ) ans += str[Len2-1]; return ans; } };
E 牛牛摇骰子
小范围直接打表 大范围就应该是一直加11过去的 (后面发现只要22的表就行了
class Solution { public: /** * 把所有询问的答案按询问顺序放入vector里 * @param arr int整型vector 要查询坐标的数组 * @return int整型vector */ int a[100] = {0,3,4,1,2,3,2,1,2,3,2,1,4,3,2,3,4,3,2,3,4,3,2}; vector<int> MinimumTimes(vector<int>& arr) { int Size=arr.size(); vector<int> ans; for(int i=0;i<Size;++i) { if(arr[i]<=22) { ans.push_back(a[arr[i]]); continue; } int m=arr[i]%11,tmp=200000000; for(int j=m;j<=22;j+=11)///22范围内以加11起步可能有两个地方 { tmp=min(tmp,a[j]+(arr[i]-j)/11);///要跑多少次11 } ans.push_back(tmp); } return ans; } };