1如果复杂考虑枚举变量是否恰当,比如说这里枚举的是首节点和长度(好题),有的地方用双指针比较方便
/*
L1-006 连续因子 (20分)
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2
31
)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
*/
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int N, temp;
int count = 0, maxcount = 0, start = 0;
cin >> N;
for (int i = 2; i <= sqrt(N) ; i++) {
temp = N;
count = 0;
int j = i;
while (temp%j==0) {
temp /= j++;
count++;
}
if (count > maxcount) {
maxcount = count;
start = i;
}
}
if (maxcount) {
cout << maxcount << endl;
for (int i = 0; i < maxcount; i++) {
cout << start + i;
if (i != maxcount - 1)
cout << "*";
}
}
else
cout <<"1"<<endl<< N;
return 0;
}
2特别复杂的话看一下自己的思路或者做法是否有问题?
3特别复杂而且自己思路什么做法都看了没问题的时候,尽量使用函数简化冗余的代码,用函数去分块思考,一步一步的解决也好debug
字符串有空格,可以建一个vector数组存空格和其他元素,以元素的开头作为分类
恶心的模拟
/*
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了 I;
把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
把原文中所有独立的 I 和 me 换成 you;
把原文中所有的问号 ? 换成惊叹号 !;
在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。
输入样例:
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出样例:
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
*/
//能用清除的就用清除不要用replace代替erase
//replace不能这样用要使用数组存下然后倒序replace,字母之间是这样,标点前是这样,后面的独立性replace也是这样
//然后还有问题就是所有操作都是对原文为基础的操作这个读题的细节非常重要
/*实在改不动了,提出以上几个问题去修改
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
bool biaodian(char s)
{
if(!isdigit(s)&&!isalpha(s)&&s!=' ')
{
return true;
}
else return false;
}
string kong(string s1)
{
string s;
s=s1;
int num=s1.size();
int kong1=0;
int biaoji;
for(int i=0;i<=num-1;i++)
{
if(s1[i]!=' ')
{
biaoji=i;
break;
}
else kong1++;
}
int kong2=0;
for(int i=num-1;i>=0;i--)
{
if(s1[i]!=' ') break;
else kong2++;
}
if(kong1!=0) s.erase(0,kong1);
if(kong2!=0) s.erase(num-kong2,kong2);
s1=s;
num=s.size();
for(int i=biaoji;i<=num-2;i++)
{
if(s1[i]==' '&&isalpha(i+1))
{
int shu=0;
int j=i;
for(;j>=0;j--)
{
if(isdigit(s1[j])) break;
shu++;
}
s.replace(j+1,shu," ");
}
}
s1=s;
num=s.size();
for(int i=0;i<=num-1;i++)
{
if(biaodian(s1[i])==true)
{
int num5=0;
int j=i;
for(;j>=0;j--)
{
if(s1[j]!=' ') break;
else num5++;
}
if(num5!=0) s.erase(j+1,num5);
}
}
return s;
}
string xiao(string s1)
{
int num=s1.size();
for(int i=0;i<=num-1;i++)
{
if(s1[i]>='A'&&s1[i]<='Z'&&s1[i]!='I') s1[i]=s1[i]+'a'-'A';
}
return s1;
}
bool duli(string s,int qian,int hou)
{
int num=s.size();
if(qian-1<0&&hou+1<=num-1)
{
if(s[hou+1]==' '||biaodian(s[hou+1])) return true;
else return false;
}
if(qian-1>=0&&hou+1>num-1)
{
if(s[qian-1]==' '||biaodian(s[qian-1])) return true;
else return false;
}
if(qian-1<0&&hou+1>num-1) return true;
if(qian-1>=0&&hou+1<=num-1)
{
if((s[hou+1]==' '||biaodian(s[hou+1]))&&(s[qian-1]==' '||biaodian(s[qian-1]))) return true;
else return false;
}
}
string cancouldimebiaodian(string s1)
{
string s,s2,s3,s4,s5;
s2="can you";
s3="could you";
s=s1;
s4="I";
s5="me";
int num=s1.size();
for(int i=0;i<=num-7;i++)
{
if(s1.substr(i,7)==s2&&duli(s1,i,i+6)) s.replace(i,7,"I can");
}
s1=s;
for(int i=0;i<=num-8;i++)
{
if(s1.substr(i,8)==s3&&duli(s1,i,i+7)) s.replace(i,8,"I could");
}
s1=s;
for(int i=0;i<=num-1;i++)
{
if(s1.substr(i,1)==s4&&duli(s1,i,i)) s.replace(i,1,"you");
}
s1=s;
for(int i=0;i<=num-2;i++)
{
if(s1.substr(i,2)==s5&&duli(s1,i,i+1)) s.replace(i,2,"you");
}
s1=s;
for(int i=0;i<=num-1;i++)
{
if(s1[i]=='?') s[i]='!';
}
return s;
}
int main()
{
int n;
string s1;
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
getline(cin,s1);
cout<<s1<<endl;
s1=kong(s1);
s1=xiao(s1);
s1=cancouldimebiaodian(s1);
cout<<"AI: "<<s1<<endl;
}
return 0;
}
*/
//真正好的思路是这样子做的(根据空格和分隔符将字符串分割为独立的字符串。)
#include<iostream>
#include<ctype.h>//提供那个isdigit()啥的函数的
#include<vector>
#include<string>
using namespace std;
vector<string> v;
int main()
{
int n;
string s;
cin>>n;
getchar();
while(n--)
{
getline(cin,s);
cout<<s<<endl<<"AI: ";
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]=='?') s[i]='!';
else if(isupper(s[i])&&s[i]!='I') s[i]=tolower(s[i]);
}
v.clear();//开始巧妙的大模拟思路了(这种思路是需要去学习的)
for(int i=0;i<len;)
{
string tmp="";
if(isalpha(s[i]))//如果开始字符是字母(这种方法是需要去学习的)
{
while(i<len&&isalpha(s[i])) tmp+=s[i++];
}
else if(isdigit(s[i]))
{
while(i<len&&isdigit(s[i])) tmp+=s[i++];
}
else if(s[i]==' ')//如果开始字符是数字,跳过其后的连续空格
{
tmp=" ";
while(i<len&&s[i]==' ') i++;
}
else//否则是分隔符
{
tmp+=s[i];
i++;
if(v.size()>0&&v.back()==" ") v.pop_back();
}
if(tmp==" "&&(v.empty()||i==len)) continue;//去掉首尾的空格
v.push_back(tmp);
}
for(int i=0;i<v.size();i++)
{
if(v[i]=="I"||v[i]=="me") v[i]="you";
else if(v[i]=="you")
{
if(i<2||!(v[i-1].length()==1&&(!isalnum(v[i-1][0])))) continue;//如果i<2或者v【i-1】不是分隔符或者空格就跳过
if(v[i-2]=="can")
{
v[i-2]="I";
v[i]="can";
}
else if(v[i-2]=="could")
{
v[i-2]="I";
v[i]="could";
}
}
}
for(int i=0;i<v.size();i++) cout<<v[i];
cout<<endl;
}
return 0;
}
循环的顺序也是题目复杂程度的要素,如何循环比较简便,增加变量或许也能减少复杂度
/*
L1-049 天梯赛座位分配 (20分)
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。
输入格式:
输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。
输出格式:
从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。
输入样例:
3
3 4 2
输出样例:
#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
*/
//感觉循环很难的话就增加变量或许能是复杂度降低
#include<iostream>
#include<stdio.h>
using namespace std;
int num[111];//记录每个学校的队伍数量
int pos[111][11][11];//i学校j队伍中k队员的位置
int maxx,pre;//maxx记录学校中的队伍数量的最大值,pre记录上一个被编号的学校
int x;//记录编号
int main()
{
int n;//学校数量
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
maxx=max(maxx,num[i]);
}
for(int j=1;j<=maxx;j++)//巧妙之处在于这里的循环,循环的顺序决定是这个题目是否好做
{
for(int k=1;k<=10;k++)
{
for(int i=1;i<=n;i++)
{
if(j<=num[i])
{
if(pre==i)
{
x+=2;
}
else x++;//这里的x用的十分巧妙
pos[i][j][k]=x;
pre=i;
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<"#"<<i<<endl;
for(int j=1;j<=num[i];j++)
{
for(int k=1;k<=10;k++)
{
if(k<=9) cout<<pos[i][j][k]<<" ";
else cout<<pos[i][j][k]<<endl;
}
}
}
return 0;
}
//这题也是
/*
L1-039 古风排版 (20分)
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
*/
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
getchar();
getline(cin,s);
char c[1000][1000];
int ss=s.size();
int lie;
if(ss%n==0) lie=ss/n;
else lie=ss/n+1;
int i=0;
for(int i=0;i<=ss-1;i++)
c[i%n][lie-1-i/n]=s[i];
for(i=ss%n;i<=n-1;i++)
{
if(i==0) break;
else c[i][0]=' ';
}
for(i=0;i<=n-1;i++)
{
for(int j=0;j<=lie-1;j++) printf("%c",c[i][j]);
printf("\n");
}
return 0;
}