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;}





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 妻子在洗澡我和她的闺蜜电影 穿花裙子的母亲午休 沙发睡觉以为你是爸爸 夫妻小说全文阅读 妈厨房穿内裤做饭被 年轻漂亮的母亲在厨房做饭 客厅沙发午睡的母亲 午睡的儿子 沙发 母亲正在午睡我却视频 母亲做饭时后面进入免费 妻子和她妈一起和我睡小说 孑母奸情在线播放 大嫂中文字幕129视频在线 做饭的时候儿子从后面 艳姆1-6无删减完整 儿子你不能这样啊国语 在线 在厕所里肉妈咪第一章 儿子你不能这样啊国语17分钟 不行 我们不能这样 征服护士妈全文目录34章 迷糊故意穿超短裙坐公交 大妈咪女教师全集 雪白短裙教师妈咪风雨夜 母亲轮陷公交 客厅弄醒穿花裙子午睡的妈 沙发午睡花裙子在线资源 公交上的妈咪 儿子你要高就快点你国语 花裙子母亲午睡 儿子你不能这样啊国语高清 被要求穿超级短的超短裙 穿花裙子躺在沙发上 客厅弄醒午睡的妈连接 家庭毋HH伦s线视频中字 客厅弄硬午睡的儿子短文 客厅搞午睡的母亲 弄醒客厅午睡的母亲在线播放 弄醒午睡的妈视频连接 在客厅睡的午的母亲电影 客厅午睡的母亲在线下载 韩国午睡弄醒午睡的妈