【蒻爆了的NOIP系列--普及组复赛】(4)NOIP2013普及组复赛题解
2016-09-04 07:00
531 查看
这只是一个作业,如果有帮到您的,我只能说。。。这不科学。。。
————————————华丽的分割线————————————
第一题:
神似noip2016t1…
貌似就数据范围和输入方式变了,要搜的数变成变量了吗。。。
不讲了自己看2010去。。。(等下!!!这句话删掉!!!)
不过。。。这道题并没有这么easy。。。
我们要考虑要搜的数为0的情况。。。
突然发现(高级算法)把我搞闷逼了。。。
所以我用的是低级算法。。。
不过也要特判一下,,,
具体看代码。。。
————————————华丽的分割线————————————
第二题:
首先这道题的算式一定是由很多个数与一些数的乘积组成的,于是我们可以遇到数字就存到一个变量里,遇到乘号就记一个值,在遇到下一个符号后把两个数相乘,遇到加号就把变量的值加进答案里。
程序如下:
注意如果最后不mod只有30分(太恶心了吧)
————————————华丽的分割线————————————
第三题:
小盆友的数字。。。
这道题正解不开longlong50分,开了80,加个小技巧AC
首先我们发现特征值为最大子段和没意见吧qwq。
然后我们继续分析分数。。。
会机智的发现因为特征值是单调递增的所以分以下情况:
1。如果他的前一个小朋友的特征值大于0,那么说明前面特征值是正的,那最大特征值就是左边的小屁孩了,分数=前一个小朋友的分数+前一个小朋友的特征值,更新当前最大值。
2。如果他的前一个小朋友的特征值小于0,那说明什么?说明前面小盆友的特征值都是负的,不难发现他的分数=第二个小朋友的分数。
Q:小技巧是什么
A:看【论小技巧的自我修养】(1)论模的优化
代码
————————————华丽的分割线————————————
第四题:
嗯。。。第4题。。。
引用我的题解qwq
首先我们看输入,每一趟火车给我们的关系是什么?拿样例来说,4 1 3 5 6。就是1,3,5,6一定比2,4来的大。
于是,我们把1,3,5,6各向2,4连边。记在一个邻接矩阵里。
全部输入完以后,就可以乱搞(等等,这个词删掉)写正解了。
此时,没有入边的点都是啥?当然是最大的了。为了让级数最少,我们把它们都当做同一个级别的,删掉,答案++。
然后,再找下一个级别的车站。
就这样找呀找,找完所有的车站,程序结束~~~
重新审视算法,这不就是拓扑吗2333333333333333333333333333333333333
代码酱如下:
————————————华丽的分割线————————————
我中了忌开电脑的毒qwq 。。。。。
光速打脸啪啪啪
————————————华丽的分割线————————————
第一题:
神似noip2016t1…
貌似就数据范围和输入方式变了,要搜的数变成变量了吗。。。
不讲了自己看2010去。。。(等下!!!这句话删掉!!!)
不过。。。这道题并没有这么easy。。。
我们要考虑要搜的数为0的情况。。。
突然发现(高级算法)把我搞闷逼了。。。
所以我用的是低级算法。。。
不过也要特判一下,,,
具体看代码。。。
#include <cstdio> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <ctime> #include <algorithm> #include <queue> #include <map> #define ci const int #define ri register int #define ll long long #define reg register #define boom return #define cmax(a,b) (a)>(b)?(a):(b) #define cmin(a,b) (a)<(b)?(a):(b) #define For(i,a,b) for(i=a;i<b;i++) using namespace std; int l,r,ans,z; int main() { int i,j; scanf("%d%d",&l,&r); for(i=0;i<=l;i++) { z=i; for(j=0;j<10;j++)ans+=(z%10==r)&&z,z/=10; } printf("%d",ans); boom 0; } //没有什么是两个巴掌不能解决的,如果有就再来两个巴掌
————————————华丽的分割线————————————
第二题:
首先这道题的算式一定是由很多个数与一些数的乘积组成的,于是我们可以遇到数字就存到一个变量里,遇到乘号就记一个值,在遇到下一个符号后把两个数相乘,遇到加号就把变量的值加进答案里。
程序如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <ctime> #include <algorithm> #include <queue> #include <map> #define ci const int #define ri register int #define ll long long #define reg register #define boom return #define cmax(a,b) (a)>(b)?(a):(b) #define cmin(a,b) (a)<(b)?(a):(b) #define For(i,a,b) for(i=a;i<b;i++) using namespace std; char a; int add; bool op=0; int main() { int i=0,j=0; while(a=getchar(),a!='\n') { switch(a) { case '+':if(op)i=(i*j)%10000,j=0;op=0,add=(add+i)%10000,i=0;break; case '*':if(op)i=(i*j)%10000,j=0;op=1,j=i,i=0;break; default:i=(i*10+a-'0')%10000; } } if(op)i*=j; add+=i; printf("%d",add%10000); return 0; } //没有什么是两个巴掌不能解决的,如果有就再来两个巴掌
注意如果最后不mod只有30分(太恶心了吧)
————————————华丽的分割线————————————
第三题:
小盆友的数字。。。
这道题正解不开longlong50分,开了80,加个小技巧AC
首先我们发现特征值为最大子段和没意见吧qwq。
然后我们继续分析分数。。。
会机智的发现因为特征值是单调递增的所以分以下情况:
1。如果他的前一个小朋友的特征值大于0,那么说明前面特征值是正的,那最大特征值就是左边的小屁孩了,分数=前一个小朋友的分数+前一个小朋友的特征值,更新当前最大值。
2。如果他的前一个小朋友的特征值小于0,那说明什么?说明前面小盆友的特征值都是负的,不难发现他的分数=第二个小朋友的分数。
Q:小技巧是什么
A:看【论小技巧的自我修养】(1)论模的优化
代码
#include <cstdio> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <ctime> #include <algorithm> #include <queue> #include <map> #define ci const int #define ri register int #define ll long long #define reg register #define boom return #define cmax(a,b) (a)>(b)?(a):(b) #define cmin(a,b) (a)<(b)?(a):(b) #define For(i,a,b) for(i=a;i<b;i++) using namespace std; const ll MAXN=1000086; struct chi { ll nu,fea,poi; }a[MAXN]; ll n,Mod,ans,maxx,maxnow[MAXN],pd; int main() { ll i; scanf("%lld%lld",&n,&Mod); for(i=1;i<=n;i++)scanf("%lld",&a[i].nu); maxnow[1]=a[1].fea=a[1].poi=a[1].nu; pd=(a[1].nu>=0),maxx=a[2].poi=a[1].nu*2; for(i=2;i<=n;i++) { a[i].fea=cmax(a[i-1].fea+a[i].nu,a[i].nu); maxnow[i]=cmax(maxnow[i-1],a[i].fea); } for(i=3;i<=n;i++) if(maxnow[i-1]>=0) { a[i].poi=a[i-1].poi+maxnow[i-1]; if(a[i].poi>a[1].poi)pd=1; if(a[i].poi>1000000000)a[i].poi%=Mod; } else a[i].poi=a[2].poi; ans=(pd?a .poi:a[1].poi)%Mod; printf("%lld",ans); return 0; } //没有什么是两个巴掌不能解决的,如果有就再来两个巴掌
————————————华丽的分割线————————————
第四题:
嗯。。。第4题。。。
引用我的题解qwq
首先我们看输入,每一趟火车给我们的关系是什么?拿样例来说,4 1 3 5 6。就是1,3,5,6一定比2,4来的大。
于是,我们把1,3,5,6各向2,4连边。记在一个邻接矩阵里。
全部输入完以后,就可以乱搞(等等,这个词删掉)写正解了。
此时,没有入边的点都是啥?当然是最大的了。为了让级数最少,我们把它们都当做同一个级别的,删掉,答案++。
然后,再找下一个级别的车站。
就这样找呀找,找完所有的车站,程序结束~~~
重新审视算法,这不就是拓扑吗2333333333333333333333333333333333333
代码酱如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <ctime> #include <algorithm> #include <queue> #include <map> #define ci const int #define ri register int #define ll long long #define reg register #define boom return #define cmax(a,b) (a)>(b)?(a):(b) #define cmin(a,b) (a)<(b)?(a):(b) #define For(i,a,b) for(i=a;i<b;i++) using namespace std; ci MAXN=1086; int in[MAXN],al[MAXN][MAXN],a[MAXN][MAXN],minn=2147483647,maxx=-2147483647,n,m; int tsort() { int i,j,ans=0,del=0,de[MAXN]={0},d[MAXN]={0}; while(++ans) { for(i=minn;i<=maxx;i++) { if(!de[i]&&!in[i]&&d[i]!=ans) { for(j=minn;j<=maxx;j++) if(al[i][j])al[i][j]--,in[j]--,d[j]=ans; del++,de[i]=1; } } if(del>maxx-minn)return ans; } } int main() { int i,j,k,b[MAXN]; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { memset(b,0,sizeof(b)); scanf("%d",&a[i][0]); for(j=1;j<=a[i][0];j++)scanf("%d",&a[i][j]),b[a[i][j]]++; for(j=a[i][1];j<=a[i][a[i][0]];j++) { if(!b[j])for(k=1;k<=a[i][0];k++) if(!al[a[i][k]][j])al[a[i][k]][j]=1,in[j]++; } minn=cmin(minn,a[i][1]); maxx=cmax(maxx,a[i][a[i][0]]); } printf("%d",tsort()); return 0; } //没有什么是两个巴掌不能解决的,如果有就再来两个巴掌
————————————华丽的分割线————————————
我中了忌开电脑的毒qwq 。。。。。
光速打脸啪啪啪
相关文章推荐
- 【蒻爆了的NOIP系列--普及组复赛】(2)NOIP2011普及组复赛题解
- 【用膝盖写代码系列】(5):NOIP2013普及组复赛详解
- 【蒻爆了的NOIP系列--普及组复赛】(5)NOIP2014普及组复赛题解
- 【蒻爆了的NOIP系列--普及组复赛】(3)NOIP2012普及组复赛题解
- NOIP2013普及组 题解
- NOIP2016普及组复赛第一题的ACC程序加题解pascal
- noip2013题解 普及组
- NOIP 2013 普及组 复赛 count 计数问题
- 【用膝盖写代码系列】(1):NOIP2010普及组复赛详解
- 【用膝盖写代码系列】(2):NOIP2011普及组复赛题目详解
- 【蒻爆了的NOIP系列--普及组复赛】(1)NOIP2010普及组复赛题解
- NOIP2016普及组复赛第二题60分程序加题解pascal大神求帮忙!!!———回文日期
- 【用膝盖写代码系列】(2):NOIP2011普及组复赛详解
- NOIP2017普及组复赛题解
- NOIP 2013 普及组 复赛 level 车站分级
- NOIP2013-普及组复赛-第一题-计数问题
- NOIP-2016-普及组 复赛题解
- 【用膝盖写代码系列】(4):NOIP2014普及组复赛详解
- [NOIP2013普及组]车站分级
- [noip2013]转圈游戏 题解