zoukankan      html  css  js  c++  java
  • NOIP2013普及组 -SilverN

    T1  计数问题

    题目描述

    试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1

    到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。

    输入输出格式

    输入格式:

    输入文件名为 count.in。

    输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。

    输出格式:

    输出文件名为 count.out。

    输出共 1 行,包含一个整数,表示 x 出现的次数。

    输入输出样例

    输入样例#1:
    11 1
    输出样例#1:
    4

    说明

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

    并没有难度,枚举每个数的每一位就行

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int main(){
     5     int n,x;
     6     cin>>n>>x;
     7     int i,c=0;
     8     for(i=1;i<=n;i++){
     9         int a=i;
    10         while(a!=0){
    11             if(a%10==x)c++;
    12             a/=10;
    13         }
    14     }
    15     cout<<c;
    16     return 0;
    17 }

    T2 表达式求值

    题目描述

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

    输入输出格式

    输入格式:

    输入文件为 expr.in。

    输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘

    法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保

    证这一行只有 0~ 9、+、*这 12 种字符。

    输出格式:

    输出文件名为 expr.out。

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

    请只输出最后 4 位,前导 0 不输出。

    输入输出样例

    输入样例#1:
    1+1*3+4
    
    输出样例#1:
    8
    输入样例#2:
    1+1234567890*1
    输出样例#2:
    7891
    输入样例#3:
    1+1000000003*1
    输出样例#3:
    4

    说明

    对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;

    对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;

    对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

     1 /*NOIP2013普及组t2 洛谷P1981 表达式求值*/
     2 /**/
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<cstring>
     6 #include<cstdio>
     7 #include<cmath>
     8 using namespace std;
     9 char last;
    10 char c;
    11 int x=0;
    12 int a=0,b=1;
    13 int sum=0;
    14 int main(){
    15     int i,j;
    16     bool flag=1;
    17     do{
    18         if(cin>>c);
    19         else{
    20             flag=0;
    21             c='+';//相当于在整个串最后补个+号,以完成全部运算
    22         }
    23         if(c>='0' && c<='9')x=x*10+c-'0';//读取数
    24         else{
    25             a=x;//如果读到的不是数字,把之前读到的数存起来
    26             x=0;//初始化
    27         }
    28         if(c=='*'){//处理乘号,方法是先记下这个数,下次读到乘号再计算
    29             last=1;
    30             b=(a*b)%10000;//有连续乘号时,累乘
    31         }
    32         if(c=='+'){
    33             if(last){//上一个是乘号的情况
    34                 a=(a*b)%10000;
    35                 sum=(sum+a)%10000;
    36                 b=1;
    37                 last=0;
    38             }
    39             else sum+=a;//上一个是加号的情况
    40         }
    41         
    42     }while(flag==1);
    43     printf("%d",sum%10000);
    44     return 0;
    45 }

    T3 小朋友的数字

    题目描述

    有 n 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个

    小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋

    友手上的数字之和的最大值。

    作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:第一个小

    朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),

    小朋友分数加上其特征值的最大值。

    请计算所有小朋友分数的最大值,输出时保持最大值的符号,将其绝对值对 p 取模后

    输出。

    输入输出格式

    输入格式:

    输入文件为 number.in。

    第一行包含两个正整数 n、p,之间用一个空格隔开。

    第二行包含 n 个数,每两个整数之间用一个空格隔开,表示每个小朋友手上的数字。

    输出格式:

    输出文件名为 number.out。

    输出只有一行,包含一个整数,表示最大分数对 p 取模的结果。

    输入输出样例

    输入样例#1:
    5 997 
    1 2 3 4 5 
    
    输出样例#1:
    21
    
    输入样例#2:
    5 7 
    -1 -1 -1 -1 -1 
    
    输出样例#2:
    -1

    说明

    Case 1:

    小朋友的特征值分别为 1、3、6、10、15,分数分别为 1、2、5、11、21,最大值 21

    对 997 的模是 21。

    Case 2:

    小朋友的特征值分别为-1、-1、-1、-1、-1,分数分别为-1、-2、-2、-2、-2,最大值

    -1 对 7 的模为-1,输出-1。

    对于 50%的数据,1 ≤ n ≤ 1,000,1 ≤ p ≤ 1,000所有数字的绝对值不超过 1000;

    对于 100%的数据,1 ≤ n ≤ 1,000,000,1 ≤ p ≤ 10^9,其他数字的绝对值均不超过 10^9。

     
    这上百万个小朋友的老师还真是累啊……
     
    完全可以读一个算一个,每次把新算出的数值和之前保存的最大值比较,得到新的最大值。
    特征值和分数都这么处理
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 const long long inf=1000000005;
     7 int n,p,a[1000500];
     8 
     9 long long su[1000500]={0};//特征值,也可以不要数组 
    10 long long scoremx=-inf;//前排最大分数 
    11 long long dmx=-inf;//分数加特征值的最大值 
    12 long long ans=-inf; 
    13 int sum1(){//计算特征值。 
    14     int i,j;
    15     long long s=0;
    16     long long mx=-inf;
    17     for(i=1;i<=n;i++){
    18         if(s+a[i]>mx)mx=s+a[i];
    19         su[i]=mx;
    20         if(s+a[i]>0) s+=a[i];
    21         else s=0;
    22     }
    23     //
    24     for(i=1;i<=n;i++){
    25         su[i]%=p<<1;//防止数据过大 
    26         //p<<1可以避免mod时的误差(如果是读一个算一个,数据不会超限制 ,而一次算完的做法就有必要处理一下数据了)
    27     }
    28     return 0;
    29 }
    30 int main(){
    31     freopen("number.in","r",stdin);
    32     freopen("number.out","w",stdout);
    33     int i,j;
    34     scanf("%d%d",&n,&p);
    35     for(i=1;i<=n;i++)scanf("%d",&a[i]);
    36     sum1();
    37     long long score;
    38 //1 处理第一个数据 
    39     scoremx=su[1];
    40     score=su[1];
    41     dmx=score+su[1];
    42 //end
    43     for(i=2;i<=n;i++){
    44         score=dmx;
    45         if(dmx>scoremx)scoremx=dmx;
    46         if(su[i]+score>dmx)dmx=su[i]+score;
    47     }
    48     printf("%d",scoremx%p);
    49     return 0;
    50 }

    T4-车站分级

    题目描述

    一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站。每个火车站都有一个级

    别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车

    次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。(注

    意:起始站和终点站自然也算作事先已知需要停靠的站点)

    例如,下表是 5 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 5 趟车次由于

    停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求。

    现有 m 趟车次的运行情况(全部满足要求),试推算这 n 个火车站至少分为几个不同的

    级别。

    输入输出格式

    输入格式:

    输入文件为 level.in。

    第一行包含 2 个正整数 n, m,用一个空格隔开。

    第 i + 1 行(1 ≤ i ≤ m)中,首先是一个正整数 si(2 ≤ si

    ≤ n),表示第 i 趟车次有 si 个停

    靠站;接下来有 si个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个

    空格隔开。输入保证所有的车次都满足要求。

    输出格式:

    输出文件为 level.out。

    输出只有一行,包含一个正整数,即 n 个火车站最少划分的级别数。

    输入输出样例

    输入样例#1:
    Case 1:
    9 2 
    4 1 3 5 6 
    3 3 5 6 
    
    Case 2:
    9 3 
    4 1 3 5 6 
    3 3 5 6 
    3 1 5 9 
    
    输出样例#1:
    Case 1:
    2
    
    Case 2:
    3
    

    说明

    对于 20%的数据,1 ≤ n, m ≤ 10;

    对于 50%的数据,1 ≤ n, m ≤ 100;

    对于 100%的数据,1 ≤ n, m ≤ 1000。

    如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠,所以一趟车从始发站到终点站之间,没停的站级别都低于停了的站。

    在低级站和高级站之间连线,构成AOV网,利用拓扑排序即可知道总共有多少级车站

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 int n,m;
     8 int a;//[第i趟车次的停靠站数]
     9 int s[2000];//[第i趟车次停靠的站] 
    10 int mp[1200][1200]={0};
    11 int book[1200];
    12 int r[1200],c[1200]; //入度出度 
    13 int st[1200];
    14 int ans=0;
    15 void rd(){
    16     scanf("%d%d",&n,&m);
    17     int i,j,k;
    18     for(i=1;i<=m;i++){
    19         memset(book,0,sizeof(book));
    20         scanf("%d",&a);
    21         for(j=1;j<=a;j++){
    22             scanf("%d",&s[j]);
    23             book[s[j]]=1;
    24         }
    25         for(k=s[1];k<=s[a];k++)//遍历从始发站到终点站
    26         {
    27             if(!book[k])
    28                 for(j=1;j<=a;j++)
    29                 if(!mp[k][s[j]])//从低级连到高级可过,从高级连到低级无误但超时 
    30                 {
    31                  mp[k][s[j]]=1;//从低级站到高级站连线 
    32                  r[s[j]]++;}//入度++ 
    33         }
    34         
    35     }
    36 }
    37 int main(){
    38 //    freopen("level.in","r",stdin);
    39 //    freopen("level.out","w",stdout);
    40     rd();
    41     int i,j;
    42     int top=0;
    43     memset(book,0,sizeof(book));
    44     while(1){//拓扑排序 
    45         ans++;//循环次数即为总级数 
    46         top=0;
    47         for(i=1;i<=n;i++)
    48             if(!r[i] && !book[i])//所有没有入度且之前没处理过的点,都是同一级别的 
    49             {
    50                 top++;
    51                 st[top]=i;//入站 
    52                 book[i]=1;//标记为已处理 
    53             }
    54             
    55         if(!top)break;//栈为空,说明所有点都排好序了 
    56         for(j=1;j<=n;j++)
    57           for(i=1;i<=top;i++){
    58               if(mp[st[i]][j]){
    59                   mp[st[i]][j]=0;
    60                   r[j]--;
    61               }
    62           }    
    63         if(!top)break;
    64     }    
    65     
    66     printf("%d",ans-1);
    67     
    68     
    69     return 0;
    70 }
    level
  • 相关阅读:
    Redis string
    java 是 传值还是传址 Pass-by-value or Pass-by-reference
    IDEA 适用技巧
    测试 MD
    pyqt5 学习总结
    win10 安装anaconda 无法使用pip 报错缺少SSL模块
    Hadoop datanode无法启动
    Ansible 安装jdk
    java 安装后 不能 java javac 说找不到命令 -bash: javac: command not found
    如何去掉MapReduce输出的默认分隔符
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5575021.html
Copyright © 2011-2022 走看看