洛谷题解(持续更新)

洛谷题解(持续更新)

本人在读研究生,平时学业繁忙故更新不及时,谢谢大家理解和支持,作此题解一来为了在琐碎的科研生活中锻炼思维;二来希望和大家一起交流讨论,本人代码能力不强,无法解决专业的ACM试题,但是个人认为无论遇到任何问题,都应该有清晰的思路。
如有解释欠佳之处,希望大家指出~

P1067 多项式输出

在这里插入图片描述
在这里插入图片描述
思路:本题没有难度系数,但是需要把所有情况考虑到。我是按照指数分类,再对系数的不同情况进行讨论。基本分为 -1, 0, 1 三个点段。
1.指数为 0 :根据是否为第一个出现的项决定+,其余情况只输出系数。
2.指数为1:根据是否为第一个出现的项决定+,其余情况根据系数是否为1输出X或系数和X的组合。
3.指数大于1:根据是否为第一个出现的项决定+,其余情况根据系数是否为1输出X^ 的i次组合或系数和X^的i次组合。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	int number[113], n, flag =1;
	cin>>n;
	for(int i = n; i>=0; i--)
	{
		cin>>number[ i ];
	}
	for(int  i = n; i>=0; i--)
	{
		if(i == 0)
		{
			if(number[i]>0&&!flag)
				cout<<"+"<<number[i];
			else if(number[i]!=0)
				cout<<number[i];
		}
		else if(i == 1)	
		{
			if((number[i]>1 && flag) ||number[i]<-1 )
			{
				cout<<number[i]<<"x";
				flag = 0;
			}
			else if(number[i]==1 && flag)
			{
				cout<<"x";
				flag = 0;
			}
			else if(number[i]==-1)
			{
				cout<<"-x";
				flag = 0;
			}
			else if(number[i]>1 && !flag)
			{
				cout<<"+"<<number[i]<<"x";
			}
			else if(number[i]==1 && !flag)
			{
				cout<<"+x";
			}			
		}		
		else
		{
			if((number[i]>1 && flag) ||number[i]<-1 )
			{
				cout<<number[i]<<"x^"<<i;
				flag = 0;
			}
			else if(number[i]==1 && flag)
			{
				cout<<"x^"<<i;
				flag = 0;
			}
			else if(number[i]==-1)
			{
				cout<<"-x^"<<i;
				flag = 0;
			}
			else if(number[i]>1 && !flag)
			{
				cout<<"+"<<number[i]<<"x^"<<i;
			}
			else if(number[i]==1 && !flag)
			{
				cout<<"+x^"<<i;
			}
		}	
	} 
	return 0;
}

P1540 机器翻译

在这里插入图片描述
在这里插入图片描述

思路:本题考察的是先进先出的思想,可以使用队列链表等数据结构解出。这个也是成FIFO内存置换算法的思想。由于数据量不大,我采用的是数组形式。
1.定义内存数组和数据数组。
2.每次遍历读入数据,比较是否在内存中。通过first变量的变换确定每一次置换的位置。记录置换次数
3.输出结果。

#include<iostream>
#include<stdlib.h>
#include<string.h>
#define Max_size 1100
using namespace std ;

int main()
{
	int array[ Max_size ], store[120], number = 0;
	int M, N, flag = 1, first = 0;  //flag表示是否找到这个数据
	cin>>M>>N;
	for(int i = 0; i <= N; i++) array[i] = -1;
	for(int i = 0; i <= M; i++) store[i] = -1;
	for( int i = 0; i < N ; i++)
	{
		cin>>array[i];
		for(int j = 0; j< M; j++)
		{
			if(store[ j ] == array[ i ])
				flag = 0;
		}
		if(flag == 1)
		{
			store[first] = array[i];
			first = (first + 1)%M;
			number ++;
		}
		flag = 1;
	}
	cout<<number;
}

P1563 玩具谜题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:本题考察的是一种方向转换问题。可以使用双链表,数组或者结构体等数据结构。考虑到测试数据的大小和链表操作的繁琐性。本题使用了结构体数组,根据题目操作进行编码。本题关键是仔细画图,确定每次数组下标的加减,把逆时针模拟为反向顺时针,类似补码的思想。
1.定义结构体数组。
2.遍历读入玩具数据,读入操作指令。
3.根据玩具朝向和指令方向通过取模方式模拟玩具圈内的循环过程。
4.指令输入结束,输出结果。

#include<iostream>
using namespace std;
typedef struct toy{
	int a;
	char name[11];	
}Toy;
int main()
{
	Toy toys[100010];
	int n, m, derect,number;
	cin>>n>>m;
	for(int i = 0; i<n ;i++)
		cin>>toys[i].a>>toys[i].name;
	int j = 0;
	while(m > 0)
	{
		cin>>derect>>number;
		if(derect == 0)
		{
			if(toys[j].a==1)
				j = (j+number)%n;
			else
				j = (j+n-number)%n;				 
		}
		else
		{
			if(toys[j].a==0)
				j = (j+number)%n;
			else
				j = (j+n-number)%n;	
		}
		m--;
	}
	cout<<toys[j].name;
} 

P1031均分纸牌

在这里插入图片描述
在这里插入图片描述

思路:本题考察的是一种算法思路。想明白总体的思想,即可通过。(该思路借鉴了洛谷题解的大佬!)
1.定义变量。
2.计算均值。
3.计算纸牌数值与均值的差值。
4.遍历找到均分不为0移动次数即可加一。input[i+1] += input[i]

#include<iostream>
#include<cstdio>

using namespace std;
int main ()
{
	int number, ave, tot= 0, ans = 0;
	int input[102];
	cin>>number;
	for(int i = 0;i <number; i++) 
	{	
		cin>>input[i]; 
		tot += input[i];
	}
	ave = tot/number;
	for(int i = 0; i<number; i++) 
		input[i] -= ave;
	for(int i = 0; i<number; i++)
	{
		if(input[i] == 0)
			continue;
		else
		{
			input[i+1] += input[i];
			ans ++;
		}
	}
	cout<<ans;
}

P1098 字符串的展开

在这里插入图片描述
在这里插入图片描述

思路:这道题做了很久,后来发现是自己的思考方向不对,做这样的体型应该遵照题意。

1.根据数据规格定义好变量和参数。此处我使用字符串存储,灵活度较低,可以优化。使用字符串要预先计算长度,比如伸展的最大范围:a~z,p2=8的时候就是25* 8* 100 = 20000,即答案的范围。
2.读题,分割条件。同为字母或者数字且分隔符左小于右才会发生字符串的展开。
3.分割小条件控制好输出。

代码:

#include<iostream>
#include<ctype.h>
using namespace std;
char word[102];
char ans[20002];
char change(int p, char x)
{
	if(p==1)
	{
		if('A'<=x&&'Z'>=x)
			return x+32;
		else 
			return x;
	}
	else if(p==2)
	{
		if('a'<=x&&x<='z')
			return x-32;
		else 
			return x;		
	}
	else
		return '*';
	
}

int main()
{
	int p1, p2, p3;
	cin>>p1>>p2>>p3;
	cin>>word;
	int i=0,num=0;
	char ch;
	while(word[i]!='\0')
	{
		if(i!=0&&word[i]=='-')
		{
			
			if(((isdigit(word[i-1])&&isdigit(word[i+1]))||(isalpha(word[i-1])&&isalpha(word[i+1])) )&&(word[i-1]<word[i+1]))
			{
				//cout<<"digit: "<<isdigit(word[i-1])<<isdigit(word[i+1])<<"  letter: "<<isalpha(word[i-1])<<isalpha(word[i+1])<<" "<<word[i-1]<<" "<<word[i+1]<<endl;
				if(p3==1)
				{
					
					ch = word[i-1]+1;
					while(ch!=word[i+1])
					{
						for(int i = 0; i<p2; i++)
						{
							ans[num]=change(p1,ch);
							num++;
						}
						ch++;
					}
				}
				else
				{
					ch = word[i+1]-1;
					while(ch!=word[i-1])
					{
						for(int i = 0; i<p2; i++)
						{
							ans[num]=change(p1,ch);
							num++;
						}
						ch--;
					}
				}
			}
			else
			{
				ans[num]='-';
				num++;
			}
		}
		else
		{
			ans[num]= word[i];
			num++;
		}
		i++;
	}
	ans[num] = '\0';
	cout<<ans;
}

U144892 拯救末日—探秘(根据某童鞋投稿)

https://www.luogu.com.cn/problem/U144892

思路:审题发现没什么输入空间限制,故重点不在缩减空间。观察输入数据范围,思考即可

1.输入范围是 2 × 1 0 6 2 \times 10^6 2×106 ,经过平方和计算,输出的最大范围接近 2.6 × 1 0 18 2.6\times10^{18} 2.6×1018
2.n 能被 6整除,记住这一点。
3.复习一下int, ong int, long long 的范围,发现long long 结果勉强够。
4. 用到第2点,先把n 变成 6*m 先除以6,再计算,别直接套用公式。

代码

#include <iostream>
using namespace std;
int main() {
    int T;
    long int n; //n is between 1 and 2 x 10^6

    cin>>T;
    int seq = 0;
    for(; seq<T; seq++){
        cin>>n;
        n = n/6;
        long long int lam = n*(6*n+1)*(12*n+1);
        cout<< lam<<endl;
    }

/*
    for(seq= 0; seq<T; seq++){
        cout << temp[seq] <<" "<<seq<< endl;
    }
*/
    return 0;
}

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值