QLU-第三次训练

A 珠心算测试

https://www.luogu.org/problemnew/show/P2141

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练, 既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正 整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另 外两个(不同的)数之和? 最近老师出了一些测验题,请你帮忙求出答案。

输入

输入共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。
第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出

输出共一行,包含一个整数,表示测验题答案。

样例输入

4
1 2 3 4

样例输出

2

提示

【样例说明】
    由 1+2=3,1+3=4,故满足测试要求的答案为 2。注意,加数和被加数必须是集合中的 两个不同的数。

【数据说明】
     对于 100%的数据,3 ≤ n ≤ 100,测验题给出的正整数大小不超过 10,000。

这个嘛,暴力就完事了,还要注意一下去重,每个数只能算一次,并且不能用两个相同的数相加就好了

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int n,a[110];
int main()
{
    while(~scanf("%d",&n)){
            int ans=0;
        for(int i=1;i<=n;i++)
            sc(a[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
        for(int k=1;k<=n;k++){
            if(j==i||k==i||j==k)
                continue;
            if(a[i]==a[j]+a[k]){
                    i++;          //如果相等,在判断下一个值
                   k=0;
                   j=0;
                 ans++;
            }
        }
    printf("%d\n",ans);
    }
}

 B 比例简化

https://www.luogu.org/problemnew/show/P2118

题目描述

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有149814981498 人,反对的有 902902902人,那么赞同与反对的比例可以简单的记为1498:9021498:9021498:902。

不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为5:35:35:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。

现给出支持人数A,反对人数BBB,以及一个上限LLL,请你将A比BBB化简为AAA’比BBB’,要求在AAA’和BBB’均不大于LLL且AAA’和BBB’互质(两个整数的最大公约数是111)的前提下,A’/B’≥A/B ≥ A/B≥A/B且AAA’/B/B/B’−A/B - A/B−A/B的值尽可能小。

(本题目为2014NOIP普及T2)

输入输出格式

输入格式:

共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。

输出格式:

共一行,包含两个整数A’,B’,中间用一个空格隔开,表示化简后的比例。

输入输出样例

输入样例#1: 复制

1498 902 10

输出样例#1: 复制

5 3

说明

对于100%100\%100%的数据,1≤A≤1,000,000,1≤B≤1,000,000,1≤L≤100,A/B≤L1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,A/B ≤ L1≤A≤1,000,000,1≤B≤1,000,000,1≤L≤100,A/B≤L。

 

继续暴力,对于每两个数判断是否互质就好了。

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int a,b,l;
int main()
{
    while(~scanf("%d%d%d",&a,&b,&l)){
            double ans=inf;
            double t=a*1.0/b;
            int x,y;
        for(int i=1;i<=l;i++)
        for(int j=1;j<=l;j++){
            int k=gcd(i,j);
            if(k==1){
                double p=i*1.0/j;
                if(p>=t&&p-t<ans){
                    ans=p-t;
                    x=i;
                    y=j;
                }
            }
        }
        printf("%d %d\n",x,y);
    }
}

C 螺旋矩阵

https://www.luogu.org/problemnew/show/P2239

题目描述

一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子, 则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。
根据经过顺序,在格子中 依次填入 1, 2, 3, ... , n 2 ,便构成了一个螺旋矩阵。
下图是一个 n = 4 时的螺旋矩阵。

现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。

输入

输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵 大小、待求的数所在的行号和列号。

输出

输出共一行,包含一个整数,表示相应矩阵中第 i 行第 j 列的数。

样例输入

4 2 3 

样例输出

14

提示

【数据说明】
    对于 50%的数据,1 ≤ n ≤ 100; 对于 100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

 

根据给出的矩阵可以看出,如果给出的行数和列数在这个n阶矩阵的最外面一圈,那么这个值很容易求出,

但是如果这个坐标在这个矩阵的里面,而不在最外面一圈,那就没法直接求了。

所以我们需要让这个坐标可以直接求出,那么我们就判断如果这个坐标在里面,我们就缩小这个矩阵,缩小一圈

使这个n阶矩阵缩小成n-2阶的矩阵,i,j也相应的减1。并求出缩小完的矩阵的第一行第一列的值ans=(4*n-4)+1。

在分别判断这个要求的点是在外面这一圈的第一行,最后一行,第一列还是最后一列,分四个情况判断。

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int n,u,v;
int main()
{
    while(~scanf("%d%d%d",&n,&u,&v)){
            ll ans=0;
        while(u!=n&&v!=n&&u>1&&v>1){
            ans+=4*n-4;
            u--;
            v--;
            n-=2;
        }
        if(u==1)
            ans+=v;
        else if(v==n)
            ans=ans+n+u-1;
        else if(u==n)
            ans=ans+n*2-1+(n-v);
        else ans=ans+n*3-2+(n-u);
        printf("%lld\n",ans);
    }
}

E 计数问题

https://www.luogu.org/problemnew/show/P1980

题目描述

试计算在区间 1 到 n的所有整数中,数字x(0≤x≤9) x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 111到11 11 11中,即在 1,2,3,4,5,6,7,8,9,10,111,2,3,4,5,6,7,8,9,10,111,2,3,4,5,6,7,8,9,10,11 中,数字 111 出现了 444 次。

输入输出格式

输入格式:

2个整数n,xn,xn,x,之间用一个空格隔开。

输出格式:

1个整数,表示xxx出现的次数。

输入输出样例

输入样例#1: 复制

11 1

输出样例#1: 复制

4

说明

对于 100%100\%100%的数据,1≤n≤1,000,000,0≤x≤91≤ n ≤ 1,000,000,0 ≤ x ≤ 91≤n≤1,000,000,0≤x≤9。

还是暴力,我发现这次训练的题目几乎全是暴力。。。orz

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int n,x;
int solve(int p)
{
    int ans=0;
    int t;
    while(p){
       t=p%10;
       if(t==x)
        ans++;
       p/=10;
    }
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&x)){
        int num=0;
        for(int i=1;i<=n;i++)
          num+=solve(i);
        printf("%d\n",num);
    }
}

F 表达式求值

https://www.luogu.org/problemnew/show/P1981

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘 法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31 -1 之间的整数。
输入数据保 证这一行只有 0~ 9、+、*这 12 种字符。

输出

输出只有一行,包含一个整数,表示这个表达式的值。
注意:当答案长度多于 4 位时, 请只输出最后 4 位,前导 0 不输出。

样例输入

1+1*3+4 

样例输出

8

提示

样例 计算的结果为 8,直接输出 8。

【数据范围】
    对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
     对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
    对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

 

这个终于不是暴力了,模拟。

因为它只有两个符号,一个加一个乘,所以可以用栈,也可以不用,如果不用栈,那么就先将运算符前面的数事先乘起来,如果一直是乘号,那就一直连乘,用一个变量p保存,直到遇到加号,就将p加到ans中,再将p更新成1.

这个算法的思想:

因为乘法运算级高于加法,所以我们需要先算乘法,将两个加号之间的乘法运算先算出,在计算加法。

而这个就体现在,变量ans,只计算加法,而如果遇到乘法,就用p=1开始,计算一系列乘法。再加到ans中。

还要注意的是,随时mod10000,取后四位的值

具体看代码吧

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int mod=1e4;
int ans,n;
char c;
int main()
{
          sc(n);
            ans=0;
        int p=1;
        while(scanf("%c",&c)&&(c=='*'||c=='+')){
             p*=n;
             p%=mod;
               if(c=='+'){
                ans+=p;
                ans=ans%mod;             //随时取后四位
                p=1;
               }
               scanf("%d",&n);
               n%=mod;
            }
            p*=n;
            ans+=p;
            ans%=mod;
            printf("%d\n",ans);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值