2020.11.1天梯赛

7-5:当时想复杂了,将输入的字符串放入一个字符串数组中即可。

#include<bits/stdc++.h>
#define ll long long
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
ll n;
cin>>n;
string s;
getchar();
getline(cin,s);
ll m;
m=s.size();
ll a;
ll p=0;
ll i,j;
a=(m+n-1)/n;
char al[n][a];
for(i=a-1;i>=0;i--){
for(j=0;j<n;j++){
if(p>=m){
al[i][j]=' ';
}else{
al[j][i]=s[p];
}
p++;
}
}
for(i=0;i<n;i++){
for(j=0;j<a;j++){
cout<<al[i][j];
}
cout<<endl;
}
}

7-6:当时没看懂题,一点思路都没有。后来发现就是暴力就行。

#include<bits/stdc++.h>
#define ll long long
#include<stdio.h>
#include<iostream>
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
speed_up;
ll n;
cin>>n;
ll i;
ll maxx=0;
ll m=0;
ll nn=n;
ll t=n;
for(i=2;i<sqrt(n);i++){
if(n%i==0){
ll j=i;
while(nn%j==0){
nn/=j;
j++;
m++;
}
if(m>maxx){
maxx=m;
t=i;
}
nn=n;
m=0;

}
}
if(maxx==0){
cout<<"1"<<endl;
cout<<n;
}else{
cout<<maxx<<endl;
cout<<t;
for(i=0;i<maxx-1;i++){
cout<<"*"<<t+1;
t++;
}
}

}

 7-9:不太会,看了网上的代码。

#include <bits/stdc++.h>
#define pb push_back
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
/// 返回2为素数
int issu(int a)
{
if(a<=1) return 1;
for(int i=2;i*i<=a;i++)
{
if(a%i==0) return 1;
}
return 2;
}

int main()
{
int a,b,ap[100001]={0};
cin>>a>>b;
map<int,int> res;/// 如果是幸福的,那么记录得分

for(int i=a;i<=b;i++)
{
vector<int> vv;/// 记录经过

int sum=0,x=i;

while(x!=1)
{
sum=0;

/// 计算一次迭代
while(x)
{
sum+=pow(x%10,2);
x/=10;
}
x=sum;
/// 如果发现曾经有一个一样的
if(find(vv.begin(),vv.end(),sum)!=vv.end())
{
break;
}
vv.pb(sum);/// 记录曾经
ap[sum]=1;///不独立了
}
if(sum==1) res[i]=vv.size();/// 得分
}

int flag=0;
for(auto it=res.begin();it!=res.end();it++)
{
if(!ap[it->first])
{
cout<<it->first<<" "<<it->second*issu(it->first)<<endl;
flag=1;
}
}
if(flag==0) cout<<"SAD";
return 0;
}

7-11:此题题目好理解,但实际操作不好整,还有0和-0的处理需要用到字符串,看了高师哥的代码。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int, double> PII;
const int maxn = 1000 + 5;
const double eps = 1e-9;
const int INF = 0x7fffffff;

int n, m;
struct mmp {
bool sex;
int name;
};
vector<mmp> v[maxn];
double ansA[maxn];
double ansB[maxn];

int get(string s) {
int tmp = 0;
for (auto i:s) {
if (i == '-')
continue;
tmp *= 10;
tmp += i - '0';
}
return tmp;
}

int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int k;
cin >> k;
for (int j = 1; j <= k; j++) {
string s;
cin >> s;
int tmp = get(s);
v[i].push_back(mmp{s[0] != '-', tmp});
}
}
string sa, sb;
cin >> sa >> sb;
int numA = get(sa);
int numB = get(sb);
bool sexA = sa[0] != '-';
bool sexB = sb[0] != '-';

for (int i = 1; i <= m; i++) {
bool have = false;
for (auto j:v[i])
if (numA == j.name)
have = true;
if (have) {
for (auto j:v[i])
if (sexA != j.sex)
ansA[j.name] += 1.0 / v[i].size();
}
}
for (int i = 1; i <= m; i++) {
bool have = false;
for (auto j:v[i])
if (numB == j.name)
have = true;
if (have) {
for (auto j:v[i])
if (sexB != j.sex)
ansB[j.name] += 1.0 / v[i].size();
}
}
vector<mmp> vA, vB;
double maxA = 0, maxB = 0;
for (int i = 0; i < n; i++) {
if (fabs(maxA - ansA[i]) < eps)
vA.push_back(mmp{!sexA, i});
else if (maxA < ansA[i]) {
maxA = ansA[i];
vA.clear();
vA.push_back(mmp{!sexA, i});
}

if (fabs(maxB - ansB[i]) < eps)
vB.push_back(mmp{!sexB, i});
else if (maxB < ansB[i]) {
maxB = ansB[i];
vB.clear();
vB.push_back(mmp{!sexB, i});
}
}

bool ha = false, hb = false;
for (auto i:vA)
if (i.name == numB) {
hb = true;
break;
}
for (auto i:vB)
if (i.name == numA) {
ha = true;
break;
}
bool have = ha && hb;
if (have)
cout << sa << " " << sb << endl;
else {
for (auto i:vA) {
cout << sa << " ";
if (!i.sex)
cout << "-";
cout << i.name << endl;
}
for (auto i:vB) {
cout << sb << " ";
if (!i.sex)
cout << "-";
cout << i.name << endl;
}
}
return 0;
}

7-12:注意祖师爷也可以是得道者。此题查看了网上代码。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 1e5 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
vector<int> child[100100];
int expand[100100];
double sum, z,r;

void dfs(int f, double v){
if(expand[f]){
sum += v*expand[f];
}
else{
for(int i = 0;i < child[f].size();i++){
dfs(child[f][i],r*v);
}
}
}
int main(){

int n;

cin >> n >> z >> r;
r = (100-r)/100;
for(int i = 0;i < n;i++){
int x;
cin >> x;
if(x == 0){
cin >> expand[i];
}
else{
for(int j = 0;j < x;j++){
int m;
cin >> m;
child[i].push_back(m);
}
}
}
dfs(0,z);
printf("%d\n",(int)sum);
return 0;
}

 

posted @ 2020-11-06 15:50  yyscn  阅读(135)  评论(0)    收藏  举报