7-8 连续因子
题意:给出一个正整数n,n的因子可能存在若干的连续的数字。如630可分解为3*5*6*7,其中5、6、7就是连续的数字。求出n最长连续因子的个数,输出最小的连续因子序列
思路:数据范围(1到2^31),可以知道,n的因子最大不超过sqrt(n),并且12的阶乘就已经到int到极限大小了,所以最大复杂度不超过10^7,暴力!
枚举连续因子的开头(1-sqrt(n)),若能整除,每次让因子+1一直除到不能整除为止,记录该连续因子的长度,若比之前的大,就更新连续因子的开头和长度。
特别的,只有一个素因子如49的因子只有7,则只输出n
赛时一直不能证明这种方法的可行性,同时感觉题意有点模糊,题目描述输出最小的连续因子序列,实际上是在保证长度的情况下输出最小,我以为是保证最小的情况下输出最长(恼
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e9+10;
int n, m, k, q=1,w,len=0;
stack<int>v;
void sovle(){
cin>>n;
for(int i=2;i<sqrt(n);i++){
int j=i;
m=n;
int l=0;
while(m%j==0){
m/=j;
j++;
l++;
}
if(l>len){
len=l;
k=i;
}
}
if(!k){
cout<<1<<endl;
cout<<n;
return;
}
cout<<len<<endl;
cout<<k;
for(int i=k+1;len>1;len--,i++){
cout<<"*"<<i;
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
7-9 哈利波特的考试
题意:有n种动物,给出m个两个动物之间的变形魔咒长度c,输出变成其他任意动物所需变形魔咒长度最小的动物编号(非总和,而是最大),及其所需最大魔咒长度的长度。如果有两种动物之间不能转化,输出0
思路:其实就是求全源最短路问题(Floyd算法),
找到每个动物变成其他动物的最大魔咒长度,取最小。
代码:
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e9+10;
int n, m, q, a,b,c,min1=INT_MAX;
void sovle(){
cin>>n>>m;
int d[105][105];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
d[i][j]=0;
}
else d[i][j]=1000;
}
}
for(int i=0;i<m;i++){
cin>>a>>b>>c;
d[a][b]=c;
d[b][a]=c;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
int sum=0;
for(int i=1;i<=n;i++){
sum=0;
for(int j=1;j<=n;j++){
if(i==j) continue;
if(d[i][j]==1000){
cout<<0;
return;
}
sum=max(sum,d[i][j]);
}
if(sum<min1){
min1=sum;
q=i;
}
}
cout<<q<<' '<<min1;
return;
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}
7-10 列车厢调度
题意:轨道1上有一些列车厢,你可以选择将轨道1开头的车厢移到轨道3,或者直接移到轨道2,你可以将轨道3末尾的车厢移到轨道2,但是不能移到轨道1,轨道2上的车厢不能移动。给出轨道1上车厢的排列顺序和期望轨道2车厢的排列顺序,请问能不能通过上面的操作达到给出的轨道2的排列顺序,若能则输出方案,反之输出Are you kidding me?
思路:典型的队列和栈的问题,轨道1先进先出,轨道3后进先出。(但是我是用字符串做的^ ^),为了解决弹出的问题,我将轨道1上的字符串反转后倒着遍历,这样就能pop_back,
再用另一个字符串记录轨道3的车厢。注意先判断轨道3,否则如果轨道3的末尾就是期望的车厢,再放入就会堵住导致出错,用vector<string>w存一下方案
#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m, k,a,b,c;
void sovle(){
string s,v;
cin>>s>>v;
string q;
vector<string>w;
reverse(s.begin(),s.end());
for(int i=0;i<v.size();i++){
bool ok=0;
if(!q.empty()){
if(q.back()==v[i]){
q.pop_back();
w.push_back("3->2");
continue;
}
}
for(int j=s.size()-1;j>=0;j--){
if(v[i]==s[j]){
w.push_back(("1->2"));
ok=1;
s.pop_back();
break;
}
else {
w.push_back("1->3");
q.push_back(s[j]);
s.pop_back();
}
}
if(ok==0&&q.back()!=v[i]){
cout<<"Are you kidding me?";
return;
}
else if(ok==0&&q.back()==v[i]){
w.push_back("3->2");
q.pop_back();
}
}
for(auto x:w){
cout<<x<<endl;
}
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t --){
sovle();
}
return 0;
}