NENU 17级算法学习小组Round 3 0606

题目链接

密码: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<

下边是组测试数据,注意行末没有空格。

NENU 17级算法学习小组Round 3 0606_第1张图片

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;
}

你可能感兴趣的:(NENU,17级算法学习小组)