题目描述
试计算在区间 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 出现的次数。
输入输出样例
11 1
4
说明
对于 100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。
并没有难度,枚举每个数的每一位就行
1 #include2 #include 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<
T2 表达式求值
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入输出格式
输入格式:输入文件为 expr.in。
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘
法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保
证这一行只有 0~ 9、+、*这 12 种字符。
输出格式:输出文件名为 expr.out。
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,
请只输出最后 4 位,前导 0 不输出。
输入输出样例
1+1*3+4
8
1+1234567890*1
7891
1+1000000003*1
4
说明
对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
1 /*NOIP2013普及组t2 洛谷P1981 表达式求值*/ 2 /**/ 3 #include4 #include 5 #include 6 #include 7 #include 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 取模的结果。
输入输出样例
5 997 1 2 3 4 5
21
5 7 -1 -1 -1 -1 -1
-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 #include2 #include 3 #include 4 #include 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 //end43 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 个火车站最少划分的级别数。
输入输出样例
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
Case 1:2Case 2:3
说明
对于 20%的数据,1 ≤ n, m ≤ 10;
对于 50%的数据,1 ≤ n, m ≤ 100;
对于 100%的数据,1 ≤ n, m ≤ 1000。
如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠,所以一趟车从始发站到终点站之间,没停的站级别都低于停了的站。
在低级站和高级站之间连线,构成AOV网,利用拓扑排序即可知道总共有多少级车站
1 #include2 #include 3 #include 4 #include 5 #include 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 }