Codeforces Round #696
Codeforces Round #696
文章目录
- CF1474A Puzzle From the Future
- 题意:
- 题解:
- 代码:
- CF1474B Different Divisors
- 题意:
- 题解:
- 代码:
- CF1474C Array Destruction
- 题意:
- 题解:
- 代码:
- CF1474D Cleaning
- 题意:
- 题解:
- 代码:
- CF1474E What Is It?
- 题意:
- 题解:
- 代码:
- CF1474F 1 2 3 4 ..
- 题意:
- 题解:
- 代码:
CF1474A Puzzle From the Future
题意:
在2022年,Mike发现了两个长度为n的二进制整数a和b(它们都只由前导有0的数字(和1)表示)。为了不忘记它们,他想用以下方式构造整数d:
他将a和b按位加和而不进行进位转换,从而得到一个整数c,所以c可能有一个或多个2。例如,0110和1101按位求和的结果是1211,011000和011000按位加和的结果是022000;
之后,Mike将c中相等的连续数字折叠为1位,因此得到d。经过这个操作,1211变成121,022000变成020(所以,d不会有相等的连续数字)。
不幸的是,迈克在自己计算d之前就失去了整数a。现在,为了让他高兴起来,你要找到一个长度为n的二进制整数a,使d成为最大的可能的整数。
最大可能的整数的意思是102>21,012<101,021=21,以此类推。
题解:
规律题,找到规律就行
我们发现a的第一位肯定是1(从左往右数),为了让d更大,我们要让a加b更大,且不能存在一样的数,所以从第二位开始,如果a和b的第i-1位 等于 b的第i位+1,说明第a位就不能取1,只能取0,反之可取1
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{int t;cin>>t;while(t--){int n;cin>>n;string s;cin>>s;string b="1";for(int i=1;i<n;i++){int w=s[i]-'0';int x,y;x=s[i-1]-'0';y=b[i-1]-'0';if(w+1==x+y)b+='0';else b+='1';}cout<<b<<endl;}return 0;
}
CF1474B Different Divisors
题意:
求一个数,这个数至少有4个除数,且每个除数的差至少是d。
题解:
根据题意多举例子就能发现:
第一位肯定是1,最后一位肯定是中间所有数的乘积,然后第二位比第1位大d,且我们要保证除了第一位和最后一位,其他位的数都必须是质数,这样可以保证最后一位最小
所以我们每次找大于前一位+d的质数
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e7+9;
int tag[maxn],prime[maxn];
int cnt=0;
void Prime(int N)
{memset(tag,0,sizeof(tag));tag[0]=tag[1]=1;for(int i=2;i<N;i++){if(!tag[i])prime[cnt++]=i;for(int j=0;j<cnt&&prime[j]*i<N;j++){tag[i*prime[j]]=1;if(i%prime[j]==0)break;}}
}
int main()
{Prime(1000000);int t;cin>>t;while(t--){int d;cin>>d;int x=1;x+=d;x=lower_bound(prime,prime+cnt,x)-prime;int y=prime[x];y+=d;y=lower_bound(prime,prime+cnt,y)-prime;cout<<prime[x]*prime[y]<<endl;}
}
CF1474C Array Destruction
题意:
题目给出一个长度为2n的正整数序列,现在问你是否存在一个x使得可以不断的进行如下操作,直到这个序列变为空:
从序列中找到两个数字a1,a2,使得a1+a2==x,然后从序列中删掉这两个数字,x的值也被更新,x=max(a1,a+2)。
题解:
因为n的范围并不大,所以x可以暴力枚举
因为x是单调递增的,所以第一个x必然是最大的那个数加上另一个数,最大的数是确定的,另一个数可以枚举
所以一开始枚举2n-1个另一个数,和最大的那个数一起组成最初的x,然后接下来每一步都知道x是谁,且知道最大值是谁,那么x-最大值直接二分查找。一直进行下去,如果中间有二分找不到的数,就从头枚举另一个数重新来
复杂度:O(n2logn)
这题主要看你set用的熟不熟练了
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
int T, n, a[maxn], ans;
multiset<int> st;
vector<pair<int, int> > vec;bool _check(int ii) {st.clear();for (int i = 0; i < 2*n-1; i ++) {if (i == ii) continue;st.insert(a[i]);}vec.clear();vec.push_back({a[2*n-1], a[ii]});ans = a[2*n-1] + a[ii];int tmp = a[2*n-1];for (int i = 1; i < n; i ++) {multiset<int>::iterator it = st.end(), it2;it --;int x = *it;st.erase(it);it2 = st.lower_bound(tmp - x);if (it2 == st.end()) return false;int y = *it2;if (x + y != tmp) return false;vec.push_back({x, y});tmp = max(x, y);st.erase(it2);}return true;
}bool check() {for (int i = 0; i < 2*n-1; i ++) if (_check(i)) return true;return false;
}int main() {scanf("%d", &T);while (T --) {scanf("%d", &n);for (int i = 0; i < 2*n; i ++) scanf("%d", a+i);sort(a, a+2*n);if (check()) {puts("YES");printf("%d\n", ans);for (auto x : vec) printf("%d %d\n", x.first, x.second);}else puts("NO");}return 0;
}
CF1474D Cleaning
题意:
每次拿走两个相邻位置的一个石头(可以拿多次),且有且只有一次交换两个相邻位置的机会,问能不能将所有石头拿走
题解:
如果有后一个数字大于前一个数字,我们从前往后就会出现后一个为0,前一个还不为0的情况,所以一定不可能。同理从后往前删除是一样的情况
我们用pre预先处理从前往后的差分
suf预处理从后往前的差分
如果pre与suf数组存在同一位置相等,说明就可以全部拿走
因为还有一次交换的机会,所以直接暴力交换i和i+1两个位置,然后求出当前位置新的pre和和suf,用于判断是否相等
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std ;
const int maxn = 2e5 + 10 ;
typedef long long ll ;
ll a[maxn] , pre[maxn] , suf[maxn] ;
const ll inf = 1e18 ;int main(){int t ;cin >> t ;while(t--){ll n ;cin >> n ;memset(pre , 0 , sizeof(pre)) ;memset(suf , 0 , sizeof(suf)) ;for(ll i = 1 ; i <= n ; i++) cin >> a[i] ;for(ll i = 1 ; i <= n ; i++){if(a[i] >= pre[i-1]) pre[i] = a[i] - pre[i-1] ;else pre[i] = inf / 2 ; // 预处理pre,当有不符合情况的时候,pre数组从此往后全为inf/2}for(ll i = n ; i >= 1 ; i--){if(a[i] >= suf[i+1]) suf[i] = a[i] - suf[i+1] ;else suf[i] = inf ;// 从后往前,如果有不符合,那么全为inf}bool flag = 1 ;for(ll i = 1 ; i <= n - 1 ; i++){if(pre[i] == suf[i+1]){ // 如果可以接上的话直接输出yes就行flag = 0 ;break ;}else{ll tmp1 = a[i] ; // 如果接不上,那么交换a[i]与a[i+1] 然后实现pre[i] 和 suf[i+1] 如果接的上输出yesll tmp2 = a[i+1] ;if(tmp1 >= suf[i+2] && tmp2 >= pre[i-1]){tmp1 -= suf[i+2] ;tmp2 -= pre[i-1] ;if(tmp1 == tmp2){flag = 0 ;break ;}}}}if(!flag) cout << "YES" << endl ;else cout << "NO" << endl ;}return 0 ;
}
CF1474E What Is It?
题意:
一个排列,你可以选择i , j ( i ≠ j ) ,满足a [ j ] = i , 然后交换a[i],a[j],交换收益为 (i-j)2。
让你构造一个长度为n的排列,使得交换过程所得收益最大。
题解:
我们不难发现我们每次交换,都会使得至少一个数归位(也就是a[i]=i),当所有位置归位时我们将无法再交换,所以最多交换n-1次
我们再考虑距离为n-1的对数最多是多少?只有一对,就是(1,n),除此之外没有了
我们再考虑n-2的对数最多是多少?最多是两对,就是(1,n-1)和(2,n),(当然其他考虑也是一样的),最多只有两对
当距离为n-3的也只有两对
那么最大收益就是(n-1)2 + 2*(n-2)2 + 2*(n-3)2+…
这样收益就算出来了
至于步骤我们可以你想考虑,也就是一开始数组a都是归位的,然后先弄(n-1)对,再弄(n-2)对,这样就得到最后的排列和交换过程
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;
const int maxn = 2e5 + 7;
int a[maxn];
int main() {int T;scanf("%d",&T);while(T--) {int n;scanf("%d",&n);for(int i = 1;i <= n;i++) {a[i] = i;}vector<pair<int,int> >vec;ll ans = 0;int cnt = n - 1;for(int i = n - 1;;i--) { //交换两点的距离swap(a[i + 1],a[1]);vec.push_back({i + 1,1});ans += 1ll * i * i;cnt--;if(cnt == 0) break;if(i == n - 1) continue;swap(a[n - i],a[n]);vec.push_back({n - i,n});ans += 1ll * i * i;cnt--;if(cnt == 0) break;}printf("%lld\n",ans);for(int i = 1;i <= n;i++) {printf("%d ",a[i]);}printf("\n");printf("%d\n",n - 1);for(int i = vec.size() - 1;i >= 0;i--) {printf("%d %d\n",vec[i].first,vec[i].second);}}return 0;
}
CF1474F 1 2 3 4 …
题意:
题解:
代码:
Codeforces Round #696相关推荐
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
- Codeforces Round #696 (Div. 2)
A. Puzzle From the Future (构造+贪心) 题目链接:传送门 &nsbp; 题意:给你一个二进制的数b,问你怎么凑出一个a使得c=a+b的二进制数最大,注意此处的加和并 ...
- codeforces round div2,3周赛补题计划(从开学到期末)
1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)
Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...
- Codeforces Round #563 (Div. 2)/CF1174
Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...
- Codeforces Round #270
Codeforces Round #270 题目链接 A:我是筛了下素数.事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以 B:贪心的策略,把时间排序后.取每k个的位置 C:贪心.每次 ...
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...
最新文章
- 英特尔变身数据公司 未来最大数据市场定是中国
- Linux文件的复制、删除和移动命令
- TypeError: pyqtSignal must be bound to a QObject
- 余世伟视频笔记----如何塑造管理者的性格魅力领袖根性之诚信和担当
- 修改解锁植物大战僵尸所有模式、关卡、金钱
- 基于django的视频点播网站开发-step15-项目部署 1
- mma7660(gsensor)的hwmon驱动
- 阿里云实现短信验证码登录
- 蓝队在攻防比赛中常用的防护手段汇总
- 微型计算机中什么是小随机储存器,随机存取存储器
- windows10系统自带linux子系统(WSL)的安装目录
- fastjson之@JSONField注解的几个的使用详细示范
- “应用程序无法正常启动(oxc000007b)”解决方案
- Cassandra 3.x官方文档_cassandra.yaml配置文件
- NGNIX在CENTEROS 下部署
- GLSurfaceView
- 5G+Wi-Fi 6“双管齐下”,“双千兆”普及时代还远吗?
- 用实战项目经验告诉你什么是二方包!
- Remix快速导入本地文件夹
- 什么是物联网?定义和解释
热门文章
- 各种震撼的慢镜头,奇怪的知识又增加了!​
- 为什么说人工智能是一个大谎言
- 干货整理:处理不平衡数据的技巧总结!收好不谢
- python解析xml文件选用模块_python解析xml模块封装代码
- 戴尔新版bios设置中文_戴尔电脑装机过程
- HTML5中常见的列表标签包括,介绍几个常用的HTML5标签
- 终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令
- c语言while运行出现错误,【图片】为什么我的while(1)不执行啊?【c语言吧】_百度贴吧...
- 联想 android 5.1 root权限,联想A520手机ROOT权限图文教程(附联想A520root工具)
- hotelling t2 matlab,pca主成份分析方法