进驻洛谷之普及场

最近从同学那得知洛谷,然后开始进驻洛谷,来试图进阶,卡在原地不动太难受。不进反退更难受。看我这菜鸡水平,只能打打普及场。弄完普及,再去尝试提高吧。感觉普及对我都有点难度了。果然是自己水平太菜了。

 

简单的模拟(关卡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)=an​xn+an−1​xn−1+⋯+a1​x+a0​,an​≠0

其中,a_ix^iai​xi称为ii次项,a_iai​ 称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为xx,从左到右按照次数递减顺序给出多项式。

  2. 多项式中只包含系数不为00的项。

  3. 如果多项式nn次项系数为正,则多项式开头不出现“+”号,如果多项式nn次项系数为负,则多项式以“-”号开头。

  4.  

对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于00次的项,其系数的绝对值为11,则无需输出 11)。如果xx的指数大于11,则接下来紧跟的指数部分的形式为“x^bxb”,其中 bb为 xx的指数;如果 xx的指数为11,则接下来紧跟的指数部分形式为“xx”;如果 xx 的指数为00,则仅需输出系数即可。

  1.  

多项式中,多项式的开头、结尾不含多余的空格。

输入格式

输入共有 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章