最近从同学那得知洛谷,然后开始进驻洛谷,来试图进阶,卡在原地不动太难受。不进反退更难受。看我这菜鸡水平,只能打打普及场。弄完普及,再去尝试提高吧。感觉普及对我都有点难度了。果然是自己水平太菜了。
简单的模拟(关卡2-1)
P1003 铺地毯
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角座标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这些地毯按照编号从小到大的顺序平行于座标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
输入格式
输入共n+2n+2行
第一行,一个整数nn,表示总共有nn张地毯
接下来的nn行中,第 i+1i+1行表示编号ii的地毯的信息,包含四个正整数a ,b ,g ,ka,b,g,k ,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的座标(a,b)(a,b)以及地毯在xx轴和yy轴方向的长度
第n+2n+2行包含两个正整数xx和yy,表示所求的地面的点的座标(x,y)(x,y)
输出格式
输出共11行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1−1
思路分析:
起初我想要定个数组模拟一遍,发现自己果然是头脑简单,既卡内存又卡时间。其实有个很取巧的方法,把信息先存起来,不去模拟作图,然后倒序反推,看每条信息是否容括了那个点,因为是取最上层的地毯,所以倒序推就好,找到就退出去就ok了。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[10005][5];
int main()
{
//fin;
// ios::sync_with_stdio(0);
int n;
cin >> n;
fo(k, 1, n + 1)
{
fo(i, 1, 5)
cin >>arr[k][i];
}
int x,y;
cin >> x >> y;
bool flag = false;
foo(k, n, -1)
{
if (x >= arr[k][1] && x <= (arr[k][3]+arr[k][1]) && y >= arr[k][2] && y <= (arr[k][4]+arr[k][2]))
{
cout << k << endl;
flag = 1;
break;
}
}
if (!flag)
{
cout << "-1\n";
}
}
P1067 多项式输出
题目描述
一元nn次多项式可用如下的表达式表示:
f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0f(x)=anxn+an−1xn−1+⋯+a1x+a0,an≠0
其中,a_ix^iaixi称为ii次项,a_iai 称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
-
多项式中自变量为xx,从左到右按照次数递减顺序给出多项式。
-
多项式中只包含系数不为00的项。
-
如果多项式nn次项系数为正,则多项式开头不出现“+”号,如果多项式nn次项系数为负,则多项式以“-”号开头。
对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于00次的项,其系数的绝对值为11,则无需输出 11)。如果xx的指数大于11,则接下来紧跟的指数部分的形式为“x^bxb”,其中 bb为 xx的指数;如果 xx的指数为11,则接下来紧跟的指数部分形式为“xx”;如果 xx 的指数为00,则仅需输出系数即可。
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 22 行
第一行11 个整数,nn,表示一元多项式的次数。
第二行有 n+1n+1个整数,其中第ii个整数表示第n-i+1n−i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 11 行,按题目所述格式输出多项式。
思路分析
这题卡了好多次,因为一开始思路不是很清晰,就直接上手了,细节处理起来给我整懵了。建议没有想好思路,不要下手。切勿边敲边想这类的细节题。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[105];
int main()
{
//fin;
// ios::sync_with_stdio(0);
int n;
cin >> n;
foo(i, n, -1)
{
cin >> arr[i];
}
foo(i, n, 0)
{
if (arr[i])
{
if (i == n ) //第一项
{
if (arr[i] == 1)
cout<<"x^"<<i;
else if(arr[i]==-1)
cout << "-x^" << i;
else
{
cout <<arr[i]<< "x^" << i;
}
}
else if (i > 1)
{
if (arr[i] == 1)
cout << "+x^" << i;
else if (arr[i] == -1)
cout << "-x^" << i;
else{if(arr[i]>0)
cout<<'+';
cout << arr[i] << "x^" << i;
}
}
else if (i == 1)
{
if (arr[i]==1)
cout << '+'<< 'x';
else if(arr[i]==-1)
cout<<"-x";
else
{
if(arr[i]>0)
cout<<'+';
cout<<arr[i]<<"x";
}
}
}
}
if (arr[0])
{
if (arr[0] > 0 && n != 0)
cout << '+';
cout << arr[0];
}
}
P1540 机器翻译
题目描述
这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。
假设内存中有MM个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入MM个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。
假设一篇英语文章的长度为NN个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。
输入格式
共22行。每行中两个数之间用一个空格隔开。
第一行为两个正整数M,NM,N,代表内存容量和文章的长度。
第二行为NN个非负整数,按照文章的顺序,每个数(大小不超过10001000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。
输出格式
一个整数,为软件需要查词典的次数。
输入输出样例
输入 #1
3 7
1 2 1 5 4 4 1
输出 #1
5
说明/提示
每个测试点1s1s
对于10\%10%的数据有M=1,N≤5M=1,N≤5。
对于100\%100%的数据有0≤M≤100,0≤N≤10000≤M≤100,0≤N≤1000。
整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:
空:内存初始状态为空。
1.11:查找单词1并调入内存。
2. 1 212:查找单词22并调入内存。
3. 1 212:在内存中找到单词11。
4. 1 2 5125:查找单词55并调入内存。
5. 2 5 4254:查找单词44并调入内存替代单词11。
6.2 5 4254:在内存中找到单词44。
7.5 4 1541:查找单词1并调入内存替代单词22。
共计查了55次词典。
思路分析
这题还是比较简单的,模拟一下队列就好了。不过我写的还是过于冗长了,有更节省时间和空间的思路。
有个地方不解的是,我数组如果开1005,就会wa掉第六个数据,开1010就好了。看大神的代码也都只开到1005。
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int main()
{
//fin;
// ios::sync_with_stdio(0);
int m,n;
int Myqueue[1010];
int fir,back;
fir=back=1;
cin>>m>>n;
int data;
int num_check=0;
fo(i,0,n)
{
cin>>data;
bool flag=false;
fo(k,fir,back+1)
{
if(Myqueue[k]==data)//找到单词
{flag=true; break;}
}
if(!flag)
{
num_check++;
if(back-fir<m)// poor
{
Myqueue[back++]=data;
}
else //enough
{
fir++;
Myqueue[back++]=data;
}
}
/*fo(i,fir,back)
{
cout<<Myqueue[i]<<' ';
}
cout<<fir<<"->"<<back<<endl;*/
}
cout<<num_check<<endl;
return 0;
}
P1328 生活大爆炸版石头剪刀布
题目描述
石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一 样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。
升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:
斯波克:《星际迷航》主角之一。
蜥蜴人:《星际迷航》中的反面角色。
这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。
现在,小 A
和小 B
尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小A
以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 66 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-......”,而如果小B
以“剪刀-石头-布-斯波克-蜥蜴人”长度为 55 的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-......”
已知小 A
和小 B
一共进行 NN 次猜拳。每一次赢的人得 11 分,输的得 00 分;平局两人都得 00 分。现请你统计 NN 次猜拳结束之后两人的得分。
输入格式
第一行包含三个整数:N,N_A,N_BN,NA,NB,分别表示共进行 NN 次猜拳、小 A
出拳的周期长度,小 B
出拳的周期长度。数与数之间以一个空格分隔。
第二行包含 N_ANA 个整数,表示小 A
出拳的规律,第三行包含 N_BNB 个整数,表示小 B
出拳的规律。其中,00 表示“剪刀”,11 表示“石头”,22 表示“布”,33 表示“蜥蜴人”,44表示“斯波克”。数与数之间以一个空格分隔。
输出格式
输出一行,包含两个整数,以一个空格分隔,分别表示小 A
、小 B
的得分。
输入输出样例
输入 #1复制
10 5 6 0 1 2 3 4 0 3 4 2 1 0
输出 #1复制
6 2
输入 #2复制
9 5 5 0 1 2 3 4 1 0 3 2 4
输出 #2复制
4 4
说明/提示
对于100\%100%的数据,0 < N \leq 200, 0 < N_A \leq 200, 0 < N_B \leq 2000<N≤200,0<NA≤200,0<NB≤200 。
思路分析
这题我起初是想要用函数判断模拟一遍,写到一半发现太麻烦了。就重新想了想。发现可以做一张得分表,在模拟一次就ok了
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int sore[5][5]={{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}};
int main()
{
int a[205],b[205];
//fin;
// ios::sync_with_stdio(0);
int n,alen,blen;
int asore,bsore;
asore=bsore=0;
cin>>n>>alen>>blen;
fo(i,0,alen)
cin>>a[i];
fo(i,0,blen)
cin>>b[i];
fo(i,0,n)
{
if(sore[a[i%alen]][b[i%blen]])
asore++;
else if(a[i%alen]!=b[i%blen])
bsore++;
}
cout<<asore<<' '<<bsore<<endl;
return 0;
}