标签:sel pac define 就会 向上取整 ble msu bottom 绝对值
7-5 古风排版
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入在第一行给出一个正整数N(<),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
4
This is a test case
asa T
st ih
e tsi
ce s
题解:输入字符串后,再设一个二维字符数组,因为第一列可能不够n个要用空格来表示,所以将每行第一个字符赋值为空格 ‘ ‘ ,因为要求共有n行,所以要求列数,求出字符串总长度m,列数则为m/n向上取整:
m%n==0?m/n:m/n+1; 最后再将字符串存入二维字符数组中,可以得到规律:第一行为字符串里从第一个字符开始每隔n个字符一存,在下一行则从第二个字符开始,隔n个存入数组中
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stdlib.h> using namespace std; #define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int main() { int n; string s; cin>>n; getchar(); getline(cin,s); int m=s.size(); //cout<<m<<"#"<<endl; int k; k=m%n==0?m/n:m/n+1; //cout<<k<<endl; char b[n+5][k+5]; for(int i=0;i<n;i++) { b[i][0]=‘ ‘; } int f=0,p=0; for(int i=0;i<n;i++) { for(int j=k-1;j>=0;j--) { if(f>=m){ f=0; break; } b[i][j]=s[f]; f+=n; } p++; f=p;; } for(int i=0;i<n;i++) { for(int j=0;j<k;j++) { printf("%c",b[i][j]); } if(i<n-1) cout<<endl; } }
7-6连续因子
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入在一行中给出一个正整数 N(1)。
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
630
3
5*6*7
题解:找出最长的连续因子个数,如果n为素数,则长度为1且因子为本身;其他情况则从2开始遍历到根号n,对于每个值如果不是因子则直接跳过,是的话就直接暴力找连续因子,选择最长的长度,用long long 类型
#include<bits/stdc++.h> typedef long long ll; using namespace std; int main() { long long n; scanf("%lld",&n); int k=0; ll num=0,st;//连续最长因子的个数,开始时的因子 for(ll i=2;i<=sqrt(n);i++) { if(n%i!=0) { continue; } ll j=i; ll t=n; ll ct=0; while(t%j==0) { t/=j; ct++; j++; } if(num<ct) { num=ct; st=i; } } if(num==0)//当n为素数时 { cout<<"1"<<endl; cout<<n<<endl; } else { cout<<num<<endl; for(ll i=0;i<num;i++) { if(i!=num-1)cout<<st+i<<"*"; else cout<<st+i<<endl; } } }
7-10人以群分
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。
输入第一行给出一个正整数N(2)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2?31??。
按下列格式输出:
Outgoing #: N1
Introverted #: N2
Diff = N3
其中N1
是外向型人的个数;N2
是内向型人的个数;N3
是两群人总活跃度之差的绝对值。
10
23 8 10 99 46 2333 46 1 666 555
Outgoing #: 5
Introverted #: 5
Diff = 3611
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
Outgoing #: 7
Introverted #: 6
Diff = 9359
题解:第一队为外向型,第二队为内向型,因为要求两类人的数目尽可能接近,而活跃度差距尽可能要大,所以当数目为偶数时两队人数各一半,奇数时第一队比第二队多一人即可,将活跃度从小到大排列,将小的存入人数少的一队直到人满,剩下的存入另一队即可
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int s[n+5]; int i,j,ct=0,st=0,num=0; for(i=0;i<n;i++)cin>>s[i]; sort(s,s+n); if(n%2==0) { for(i=0;i<n/2;i++)ct+=s[i]; for(i=n/2;i<n;i++)st+=s[i]; num=abs(ct-st); cout<<"Outgoing #: "<<n/2<<endl; cout<<"Introverted #: "<<n/2<<endl; cout<<"Diff = "<<num<<endl; } else { for(i=0;i<n/2;i++) { ct+=s[i]; } for(i=n/2;i<n;i++)st+=s[i]; num=abs(ct-st); cout<<"Outgoing #: "<<n/2+1<<endl; cout<<"Introverted #: "<<n/2<<endl; cout<<"Diff = "<<num<<endl; } }
7-12功夫传人
一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。
这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i
代传人只能在第i-1
代传人中拜1个师傅。我们假设已知祖师爷的功力值为Z
,每向下传承一代,就会减弱r%
,除非某一代弟子得道。现给出师门谱系关系,要求你算出所有得道者的功力总值。
输入在第一行给出3个正整数,分别是:N(≤)——整个师门的总人数(于是每个人从0到N?1编号,祖师爷的编号为0);Z——祖师爷的功力值(不一定是整数,但起码是正数);r ——每传一代功夫所打的折扣百分比值(不超过100的正数)。接下来有N行,第i行(,)描述编号为i的人所传的徒弟,格式为:
K?i?? ID[1] ID[2] ? ID[K?i??]
其中K?i??是徒弟的个数,后面跟的是各位徒弟的编号,数字间以空格间隔。K?i??为零表示这是一位得道者,这时后面跟的一个数字表示其武功被放大的倍数。
在一行中输出所有得道者的功力总值,只保留其整数部分。题目保证输入和正确的输出都不超过1。
10 18.0 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
404
题意:给出老祖宗的功力,每向下传给一代徒弟,功力会减少r%,0是老祖宗的徒弟,其中得道者的功力会增加n倍,求得道者的功力
题解:用结构体存入每一位师傅的功力,用结构体中的vector数组来存其徒弟,当为得道者时,功力扩大n倍,否则就直接传承功力即可
注意点:老祖宗也是得道者,需要加上老祖宗的n倍功力。
#include<bits/stdc++.h> #include<vector> using namespace std; typedef long long ll; const int maxn=1e5+100; int n,i,j,k,w; double z,r; struct person { double gf; vector<int>tudi; }s[maxn]; ll getsum() { double sum=0; queue<int> q; s[0].gf=z; q.push(0); while(!q.empty()) { int n=q.front(); q.pop(); for(int i=0;i<s[now].tudi.size();i++) { int t=s[now].tudi[i]; if(s[t].gf!=0)sum+=s[t].gf*s[now].gf*r; else s[t].gf=s[now].gf*r; q.push(t); } } return sum; } int main() { cin>>n>>z>>r; r=(100-r)/100; for(int i=0;i<n;i++) { cin>>k; if(k==0) { cin>>s[i].gf; } while(k--) { cin>>w; s[i].tudi.push_back(w); } } if(s[0].gf!=0) { printf("%lld\n",s[0].gf*z); } else { printf("%lld\n",getsum()); } }
标签:sel pac define 就会 向上取整 ble msu bottom 绝对值
原文地址:https://www.cnblogs.com/mxw000120/p/13944205.html