第一题Boring Apartments:
大致是说数据的存入总是为x,xx,xxx这样,最多一个数的组合有4项,给出一个带重合的数,依次求和(特别注意:不是求有多少个数,应是有几位就加几)
于是:可以先求出前面出现的数乘以出现时排序的总数为10,再加上从这个数开始的各个位即可:
#include<iostream> #include<cstdio> using namespace std; int main(){ int n,t,x,y; cin>>n; while(n--){ int sum=1,su=0; cin>>t; x=t%10; y=t/10; su++; if(x==1) while(y!=0){ su++; sum=sum+su; y/=10; } else{ sum=sum+10*(x-1); while(y!=0){ su++; sum+=su; y/=10; } } cout<<sum<<endl; } return 0; }
第二题:Yet Another Bookshelf
形式上看起来像是移动书架,但是仔细想想可以抽象为求解将所有的1挪到连续位置的次数,即求解各个1之间有多少个0即可,(注:因为可以把它一块挪动,比如两本书放在一起向右挪动一位即一次),因此可以通过用两个变量,一个求碰到第一个1之后的所有的0个数,一个在碰到1之后清零后继续计算0的个数,即最后结果为两数相减。
#include<iostream> #include<cstdio> using namespace std; int main(){ int t; cin>>t; while(t--){ int n,a[51],sum=0,se=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ if(a[i]==1){ for(int j=i;j<=n;j++){ if(a[j]==0){ sum++; se++;
}else se=0; } sum=sum-se; break; }else continue; } cout<<sum<<endl; } return 0; }
第三题和第四题说实话没有看懂它的意思,按照题意的话案例应该 不止一组解,就非常迷惑,然后也没写出来。结果看了别的题解之后发现果然,是被案例骗了……第三个可以直接用贪心,然后让最厉害的那条鱼变强。第四个帮派那个有点迷惑,后来想了一下没说要连成一条线之类的嘛,可以直接让与1不相同的都连他……
后面的题稍后再补,去吃饭了……好饿