Codeforces_801
A.直接暴力就行了,先把能组合的按线性组合掉,再枚举剩下相邻没用过的。
- #include<bits/stdc++.h>
- using namespace std;
- string s;
- int vis[] = {};
- int main()
- {
- ios::sync_with_stdio(false);
- cin >> s;
- int ans = ;
- for(int i = ;i < s.length();i++)
- {
- if(vis[i-] || vis[i]) continue;
- if(s[i-] == 'V' && s[i] == 'K')
- {
- ans++;
- vis[i-] = ;
- vis[i] = ;
- }
- }
- for(int i = ;i < s.length();i++)
- {
- if(vis[i-] || vis[i]) continue;
- if(s[i-] == 'V' || s[i] == 'K')
- {
- ans++;
- break;
- }
- }
- cout << ans << endl;
- return ;
- }
B.若存在,直接令y等于z就可以了。
- #include<bits/stdc++.h>
- using namespace std;
- string s1,s2;
- int main()
- {
- ios::sync_with_stdio(false);
- cin >> s1 >> s2;
- string s3;
- int flag = ;
- for(int
- i = ;i < s1.length();i++)
- {
- if(s2[i] <= s1[i]) s3 = s3+s2[i];
- else
- {
- flag = ;
- }
- }
- if(flag) cout << -<< endl;
- else cout << s3 << endl;
- return ;
- }
C.二分,先判断是否能永久运行,若不行,二分答案。
- #include<bits/stdc++.h>
- using namespace std;
- int n,p,a[],b[];
- bool ok(double x)
- {
- double sum = ;
- for(int i = ;i <= n;i++)
- {
- if(a[i]*x > b[i]) sum += a[i]*x-b[i];
- }
- if(sum < p*x) return ;
- return ;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin >> n >> p;
- long long sum = ;
- for(int i = ;i <= n;i++)
- {
- cin >> a[i] >> b[i];
- sum += a[i];
- }
- if(sum <= p)
- {
- cout << - << endl;
- return ;
- }
- double l = ,r = 1e18;
- while(abs(l-r) > 1e-)
- {
- double mid = (l+r)/;
- if(ok(mid)) l = mid;
- else r = mid;
- }
- cout << l << endl;
- return ;
- }
D.枚举每一组相邻3个顶点,取中间点到两边点构成直线的距离的最小值,再除以2。
- #include<bits/stdc++.h>
- using namespace std;
- int n;
- double a[],b[];
- double f(double x1,double y1,double x2,double y2,double x3,double y3)
- {
- double aa = y2-y1,bb = x1-x2,cc = x2*y1-x1*y2;
- return abs(aa*x3+bb*y3+cc)/sqrt(aa*aa+bb*bb);
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin >> n;
- for(int i = ;i <= n;i++) cin >> a[i] >> b[i];
- double ans = 1e18;
- for(int i = ;i <= n;i++)
- {
- int j = i+,k = j+;
- if(j > n) j -= n;
- if(k > n) k -= n;
- ans = min(ans,f(a[i],b[i],a[j],b[j],a[k],b[k]));
- ans = min(ans,f(a[i],b[i],a[k],b[k],a[j],b[j]));
- ans = min(ans,f(a[j],b[j],a[k],b[k],a[i],b[i]));
- }
- cout << fixed << setprecision() << ans/ << endl;
- return ;
- }
E.令p[i]为第i次出现的前i个元素积(%m),问题是如何构造最长的p序列。
设元素i,j,则①i可以向j转移的条件是gcd(m, i)丨gcd(m, j)
②i,j可以互相转移的条件是gcd(m, i)=gcd(m, j)
于是,我们把每一个gcd看成点,同一个gcd间的元素可以相互转化,然后构成图,dfs找最长路线。
有了p序列,pi-1*x%p==pi(P0=1),求解每一个x输出即可,这个可以用扩展欧几里德解决。
0这个点可以放到最后特殊处理。
- #include<bits/stdc++.h>
- #define LL long long
- using namespace std;
- int n,m,cantbe[] = {},vis[] = {},dp[],nextt[];
- vector<int> v[];
- LL ex_gcd(LL a,LL b,LL &x,LL &y)
- {
- int d = a;
- if(!b)
- {
- x = ;
- y = ;
- }
- else
- {
- d = ex_gcd(b,a%b,y,x);
- y -= (a/b)*x;
- }
- return d;
- }
- LL f(LL a,LL b,LL n)
- {
- LL d,x,y;
- d = ex_gcd(a,n,x,y);
- x = (x%n+n)%n;
- return (x*b/d)%n;
- }
- int dfs(int now)
- {
- if(dp[now] > ) return dp[now];
- dp[now] = v[now].size();
- for(int i = now*;i < m;i += now)
- {
- if(v[i].size() == ) continue;
- int t = dfs(i);
- if(dp[now] < v[now].size()+t)
- {
- dp[now] = t+v[now].size();
- nextt[now] = i;
- }
- }
- return dp[now];
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin >> n >> m;
- for(int i = ;i <= n;i++)
- {
- int x;
- cin >> x;
- cantbe[x] = ;
- }
- for(int i = ;i < m;i++)
- {
- if(!cantbe[i]) v[__gcd(i,m)].push_back(i);
- }
- memset(dp,,sizeof(dp));
- memset(nextt,-,sizeof(nextt));
- dfs();
- int now = max_element(dp,dp+m)-dp;
- cout << dp[now]+(cantbe[] == ) << endl;
- int last = ;
- while(now != -)
- {
- for(int i = ;i < v[now].size();i++)
- {
- int t = v[now][i];
- cout << f(last,t,m) << " ";
- last = t;
- }
- now = nextt[now];
- }
- if(cantbe[] == ) cout << << endl;
- else cout << endl;
- return ;
- }
Codeforces_801的更多相关文章
随机推荐
- 1046 划拳 (15 分)C语言
划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...
- 机器学习实战笔记(一)- 使用SciKit-Learn做回归分析
一.简介 这次学习的书籍主要是Hands-on Machine Learning with Scikit-Learn and TensorFlow(豆瓣:https://book.douban.com ...
- day2(使用list和tuple)
list list是一种有序的集合 >>>aaa = ['abc','bob','tracy'] >>>aaa ['abc','bob','tracy'] len( ...
- 2019 年百度之星 初赛一 1002 Game
传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任 ...
- MATLAB生成正弦波
要求:选定采样频率,生成不同频率的正弦波 程序: f1=100;%生成正弦波的频率 fs=1000;%采样频率 N=100;%采样点数 n=0:N-1; t=n/fs;%时间序列 y=sin(2*pi ...
- GXOI&GZOI
T1 与或和 2s&&512MB 简明题意:求一个矩阵的所有子序列的 \(and\)和 和\(or\)和: 子矩阵的\(and\)和就是所有值\(and\)起来:\(or\)类 ...
- MySQL 基础 SQL 操作
MySQL 用户 --登录 mysql -u<用户名> -p[密码] --修改密码 mysqladmin -u<用户名> -p[密码] password <new_pas ...
- 阿里CTR预估:用户行为长序列建模
本文将介绍Alibaba发表在KDD'19 的论文<Practice on Long Sequential User Behavior Modeling for Click-Through Ra ...
- 本地缓存google.guava及分布式缓存redis 随笔
近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...
- Java入门 - 语言基础 - 22.异常处理
原文地址:http://www.work100.net/training/java-exception.html 更多教程:光束云 - 免费课程 异常处理 序号 文内章节 视频 1 概述 2 Exce ...