题目链接
密码:12345678
A题:非常简单。不过容易PE,需要注意空格和空行的输出,用printf输入的时候需要注意getchar()的使用。
#include
using namespace std;
int main()
{
int n, flag=0;
char c;
while(cin>>c&&c!='@'){
cin>>n;
if(flag!=0) cout<=0; j--)
cout<<" ";
cout << c;
if(i==0) cout<=0; k--)
cout<<" ";
cout << c << endl;
}
}
for(int i=0; i<2*n-1; i++)
cout<
下边是组测试数据,注意行末没有空格。
B题:找规律题。打表,就是提前算好,有多组测试数据的时候,效率比较高。
#include
#define MAXN 50
typedef unsigned long long ULL;
ULL fn[MAXN+1];
void setfn()
{
int i;
fn[0] = 0;
fn[1] = 0;
fn[2] = 1;
fn[3] = 2;
for(i=4; i<=MAXN; i++)
fn[i] = fn[i-2] + fn[i-1];
}
int main(void)
{
int n, a, b;
// 先打表(以防万一测试集合大)
setfn();
scanf("%d", &n);
while(n--) {
// 读入a和b
scanf("%d%d", &a, &b);
// 输出结果
printf("%lld\n", fn[b - a + 1]);
}
return 0;
}
C题:题意:判断一个字符串是不是回文串。
思路:只需要对这个串从起始位置和末尾位置比较一下,一个for循环就行了。
#include
#include
using namespace std;
int main()
{
int n,i;
string s;
cin>>n;
while (n--)
{
cin>>s;
bool flag = true;
for (i = 0; i < s.size()/2; i++)
{
if(s[i] != s[s.size() - i - 1])
{
flag = false;
break;
}
}
if(flag)
cout<<"yes"<
D题:最短路问题。实际上这个题几乎就是把离散老师上课讲的Dijkstra最短路翻译一下其实只听老师上课讲,应该能懂Dijkstra算法,但你会觉得代码不好实现,而这道题就是教你用Dijkstra算法编程解决最短路问题。(这道题询问的是单源最短路,而Dijkstra也只能解决单源最短路问题,那么如过遇到多源最短路问题该怎么做呢?还有一种解决最短路问题的算法,floyd算法,有兴趣的同学可以了解一下,下边这个链接讲的比较好,代码也容易实现。有些单源最短路问题也能用floyd来写,但是容易超时,对于这个题,用floyd就会超时。只有五行的floyd最短路算法)
#include
#include
#include
#include
#include
#define ll long long
#define inff 1000010
#define maxn 100010
using namespace std;
int e[10100][10100];
int main()
{
int dis[201000],book[201000],i,j,n,m,t1,t2,t3,u,v,min;
int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
//读入n和m,n表示边数,m表示顶点数
scanf("%d %d",&n,&m);
//初始化
for(i=1;i<=m;i++) //注意是从1到m还是从0到m-1,要看题目怎样输入的
for(j=1;j<=m;j++)
if(i==j) e[i][j]=0;
else e[i][j]=inf;
//读入边
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
if(t3dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
cout<
E题:递推即可(也可以打表)。
#include
// 递推式 f(n) = n n<=4,f(n) = f(n-1) + f(n-3) n>4
int cow(int n)
{
if(n <= 4)
return n;
else
return cow(n-1) + cow(n-3);
}
int main(void)
{
int n;
while(scanf("%d", &n) != EOF) {
// 判定结束条件
if(n == 0)
break;
// 计算并输出结果
printf("%d\n", cow(n));
}
return 0;
}
F题:非常简单的题目,直接上代码。sort函数用起来很方便啊(起码写起来很方便)
#include
#include
#include
#include
#define inf 1000010
#define maxn 10010
#define ll long long
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
int a[110];
for(int i=0;i>a[i];
a[n]=m;
sort(a,a+n+1);
for(int i=0;i
G题:题意:输入一个正整数n,输出第n个偶数长度的回文数字。
思路:找规律题。写出前几项即可发现规律,第n个偶数长度的回文数字就是将n和“倒序”的n组合而成的,所以这题只 需要输出n,然后倒序输出n就行了。
#include
#include
#include
#include
#include
#define ll long long
#define inf 100000010
#define maxn 100010
using namespace std;
int main()
{
char a[110000];
cin>>a;
char b[110000];
int len=strlen(a);
for(int i=0;i
H题:看似简单,但实际上需要考虑多种情况。首先,没说数据范围,那么数据范围就会有非常大(爆long long)的情况,所以要用数组存;其次,要考虑0的位置,前导零,小数点末尾的0,把它们都删掉,再用strcmp函数比较一下两个字符串是否相同就行了。(这道题的数据比较水,它没有考虑前导零的情况,所以有些同学如果没考虑前导零也能过,下边的代码是考虑了前导零的情况)
#include
#include
char a[100017], b[100017];
void re1(char s[]) //去除前导零
{
int k=0;
int len=strlen(s);
for(int i=0;i= 0; i--)
{
if(s[i] == '0')
s[i] = '\0';
else
break;
len--;
}
if(s[len-1] == '.')
s[len-1] = '\0';
}
}
int main()
{
while(~scanf("%s%s",a,b))
{
re1(a);
re2(a);
//printf("**%s\n",a);//输出中间的量,debug
re1(b);
re2(b);
//printf("&&%s\n",b);
if(strcmp(a,b))
printf("NO\n");
else
printf("YES\n");
}
return 0;
}