codefoces Educational Codeforces Round 20
来源:互联网 发布:玖玖爱六粮面淘宝 编辑:程序博客网 时间:2024/06/06 18:43
A、给两个数n、m。
n表示是否能构建一个n行n列的对称矩阵(也就是里面的1必须是对称的),m表示里面需要填充m个1,按照字典序最大输出,2个矩阵字典序为从上到下第一个不同行的中,第一个从左向右第一个不同的那个数为1的矩阵大。
n*n<m肯定是无法填充的,然后一开始以为先把对角线填完是最好的,后来发现想法是错误的,应该是从第一行开始,i!=j时候填充需要2个1,i==j时候填充需要1个m,就这样从上到下,从左向右填充是最好的。
#include<iostream>#include <stdio.h>#include <string.h>#include <set>#include <vector>using namespace std;set<int>q1;set<int>q2;int map1[105][105];int map2[105][105];int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int i,j,k,f1,f2,f3,t1,t2,t3,n,m,T,t;int r,c;cin >> n >> k;if(k>(n*n)){cout << "-1" << endl;}else{memset(map2,0,sizeof(map2));for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(j>i&&k>1){map2[i][j]=1;k-=2;}else if(j==i&&k>0){map2[i][j]=1;k--;}}for(i=1;i<=n;i++){for(j=1;j<n;j++)if(map2[i][j]==1||map2[j][i]==1){cout << "1 ";}else{cout << "0 ";}if(map2[i][n]==1||map2[n][i]==1){cout << "1"<<endl;}else{cout << "0"<<endl;}}}return 0;}
B、给一个n,下一行给n个数字,要求输出n个数字,这n个数字分别为离距离它最近0的距离,输入保证有0.
从1 to n,找到0就开始向左右扫描,如果遇到0就break这个方向,如果遇到这个0距离其距离毕竟小就更新其距离。
#include<iostream>#include <stdio.h>#include <string.h>#include<stdlib.h>#include <map>#include <set>#include <math.h>#include <queue>#include <algorithm>using namespace std;int q1[205000];int q2[205000];bool q3[205000];int n;int dfs(int x){int c1,c2,k;k=x;int i=1;i=1;while(k-i>=1){if(q2[k-i]>i)q2[k-i]=i;elsebreak;i++;}i=1;while(k+i<=n){if(q2[k+i]>i)q2[k+i]=i;elsebreak;i++;}}int main(){ //freopen("in.txt","r",stdin); int i,j,k,l1,f1,f2,f3,f4,t4,t1,t2,t3,m; int T,t; cin >> n; memset(q3,0,sizeof(q3));for(i=1;i<=n;i++){ scanf("%d",&q1[i]); q2[i]=1e9+7;if(q1[i]==0)q2[i]=0;//cout <<q1[i] << " " << i << " " << q2[i] << endl;} for(i=1;i<=n;i++) if(q1[i]==0){ dfs(i);} for(i=1;i<n;i++) cout << q2[i] << " "; cout << q2[n] << endl; return 0;}C、给2个数n,m
表示要求输出这m个数相加为n,以严格递增输出,且使其全部的公约数最大。
可以这么想,既然全部可以约一个数(假设为k),那么n就必然可以整除k,且整除后数量>=m(m+1)/2,因为这样才可以有足够数量保证单调增。
因为数据是10^10,那么直接枚举其的约数就可以了,只需要枚举sqrt(n),因为
for i to sqrt(n)
如果i是n的约数,那么n/i也是其约数。
然后排序约数后二分找到最大符合条件的约数就好了。
the reason of failure:刚开始超时,是枚举的i当g1小于m(m+1)/2*i的时候才退出循环,但是当m为1,g1非常大的时候还是会超时。
#include<iostream>#include <stdio.h>#include <string.h>#include <set>#include <vector>#include <stdlib.h>#include<direct.h>#include <math.h>#include <io.h> #include <direct.h> #include <algorithm>using namespace std;long long q1[100500];int cmp1(long long x,long long y){return x<y;}int main(){//freopen("in.txt","r",stdin);long long i,j,k,f1,f2,f3,t1,t2,t3,n,m,T,t;long long g1,g2,g3,g4,g5;cin >> g1 >> n;if(n>=1e6){cout << "-1" << endl;return 0;}g2=n*(n+1)/2;if(g1<g2){cout << "-1" << endl;return 0;}j=0;for(i=1;i<=sqrt(g1);i++){ //枚举约数if(g1%i==0){ //i??g1??????????g1/I???????? q1[++j]=i;q1[++j]=g1/i;}}sort(q1+1,q1+1+j,cmp1);long long left1,right1,mid1;left1=1;right1=j;long long max1=0;while(right1>=left1){mid1=(right1+left1)/2;if(g1/q1[mid1]>=g2){left1=mid1+1;if(q1[mid1]>max1)max1=q1[mid1];}else{right1=mid1-1;}}for(i=1;i<n;i++)cout << i*max1 << " ";cout << g1-max1*n*(n-1)/2 << endl;return 0;}D、给如
4garage for sa-le
n和这样的字符串,其中有空格和-才能换行,最多可以有4行,问最长的字符串最短可以多少。
也是二分,找到一个最小的数字,满足用行数<=4,每次二分都扫描一遍,也就是判断这个数字用了几行。
the reason of failure:刚开始二分错误,找到的一直是用mid1,应该用符合条件的mid1,也就是在这个if中加一个min1。。
#include<iostream>#include <stdio.h>#include <string.h>#include <map>#include <set>#include <vector>#include <math.h>using namespace std;char s1[1050000];int q1[1050000];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int i,j,k,f1,f2,f3,f4,t1,t2,t3,t4; int n,m,l1,l2,l3; int T; scanf("%d\n",&n); char t; //t=getchar(); gets(s1); l1=strlen(s1); t1=0;t2=0;j=0; int max2=0;for(i=0;i<l1;i++){ if(s1[i]==' '||s1[i]=='-'){ max2=max(max2,t1+1);q1[++j]=t1+1;t2++;t1=0;}else{t1++;}}q1[++j]=t1;max2=max(max2,t1);t2++;int left1,right1,mid1;left1=1;right1=1e6+7;int max3=1e6+7;while(left1<=right1){mid1=(left1+right1)/2;f1=0;f2=1;if(mid1<max2){left1=mid1+1;continue;}for(i=1;i<=t2;i++){if(f1+q1[i]>mid1){f1=q1[i];f2++;}else{f1+=q1[i];}}if(f2<=n){right1=mid1-1;max3=min(max3,mid1);//Q1 }else{left1=mid1+1;}}cout << max(max3,max2) << endl;//Q2 return 0;}
- codefoces Educational Codeforces Round 20
- Educational Codeforces Round 20
- Educational Codeforces Round 20 A
- Educational Codeforces Round 20 B
- Educational Codeforces Round 20总结
- Educational Codeforces Round 20题解
- Educational Codeforces Round 20 C 数学
- Educational Codeforces Round 20 Maximal Binary Matrix
- Educational Codeforces Round 20 Distances to Zero
- Educational Codeforces Round 20-C. Maximal GCD
- 【解题报告】Educational Codeforces Round 20
- [Updating] Educational Codeforces Round 20 解题报告
- Educational Codeforces Round 1
- Educational Codeforces Round 2
- Educational Codeforces Round 2
- Educational Codeforces Round 2
- Educational Codeforces Round 3
- Codeforces Educational Round 3
- 基于物品的协同过滤推荐
- cf668B
- 解决方案:org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port
- python ml windows环境搭建 numpy(mkl)+scipy
- 一些无聊的代码
- codefoces Educational Codeforces Round 20
- 关于Uiautomator的学习历程(2)
- Android 适配
- Android自定义View绘制闪闪发光的文字
- C++作业5
- CodeForces 734 D.Anton and Chess(map)
- DAO
- 跳跃游戏-计蒜课
- Mac NSStatusBar