洛谷题解(持续更新)
洛谷题解(持续更新)
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;
}
上一篇: 乘法逆元
下一篇: P5431 乘法逆元2(逆元)