[CSP冲刺班]CSP-J2011模拟赛#2总结
题目
T1 蜗牛老师的成绩统计
T2小蜗牛的逃离
T3蜗牛老师研究基因
T4蜗牛老师的代码
T5蜗牛老师的跳跃
T1 蜗牛老师的成绩统计
{
题目大意:给出每个人的时,分,秒,从小到大输出
思路:开结构体,参数为时,分,秒,自定义排序,sort()一下
在bool mycmp(made a,made b){
return a.t<b.t||(a.t==b.t&&a.f<b.f)||(a.t==b.t&&a.f==b.f&&a.m<b.m);
}//t为小时,f为分钟,m为秒
最后得分:80pts
原因:数据最后改的,数组开小了,都怪没看钉钉
}
---------------------------------------我是分割线-----------------------------------------------
T2小蜗牛的逃离
{
题目大意:树上的小猴想在第n+1天搬家,于是他有n天准备能量,1.他可以在一天内树上采取m个能量,2.或今天不采摘能量将m加一(对不起,本人语文只考了95分,(满分120),表达能力极差,若看不懂请自行点开链接)
思路:本来我想的是动态规划,但是由于数据范围极大,导致二重循环也会超,所以只能放弃,开始考虑一重循环怎么搞,本蒟蒻便想到了贪心,可是怎么贪呢???所以我便考虑了如果m加上1能加多少能量,可以获得多少收益,是n-i,(当前天数为i),但是如果今天没有加m,反而是采摘的话可以加上m个能量,所以比较n-i和m就可以找到最优解了,想出来后,我就觉得我怎么能怎么聪明,太棒了!!!(疯狂自恋)
代码
//T2,这个代码真的有点帅!!
#include<bits/stdc++.h>
using namespace std;
int y[110000];
int main()
{
freopen("escape.in","r",stdin);
freopen("escape.out","w",stdout);
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n,x;
bool f=0;
cin>>n>>x;
long long sum=0;
memset(y,0,sizeof(y));
for(int j=1;j<=n;j++)
cin>>y[j];
for(int j=1;j<=n;j++){
if(sum+x-y[j]<0){//如果当天采后还不够吃,则-1
f=1;
cout<<-1<<endl;
break;
}
if(x<(n-j)&&sum-y[j]>=0)
x++;
else sum+=x;//否则就加上当前采摘数量
sum-=y[j];//减去花费
// printf("j== %d,y[j]== %d,sum== %d,x== %d\n",j,y[j],sum,x);
}
if(f==0) cout<<sum<<endl;
}
return 0;
}
最后得分:100pts
}
T3 蜗牛老师研究基因
{
题目大意:我也不知道怎么形容这个题干,太长了,还很不好理解,自己点链接吧
思路:用一个类似桶的东西存储时候出现,最后在比较一下
//T3
#include<bits/stdc++.h>
using namespace std;
char a[100000];
char b[100000];
int p[100000];
char num[5]={'0','A','C','G','T'};
int f[100000][5];
int main()
{
freopen("gene.in","r",stdin);
freopen("gene.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//第j列
cin>>a[j];
for(int k=1;k<=4;k++){
if(a[j]==num[k]){
f[j][k]=1;
break;
}
}
}
}
// for(int i=1;i<=m;i++){
// for(int j=1;j<=4;j++){
// if(f[i][j])
// cout<<j<<" ";
// }
// cout<<endl;
// }
int nu=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>b[j];
for(int k=1;k<=4;k++){
if(b[j]==num[k]){
if(f[j][k]==1){
if(p[j]==0){
nu++;
p[j]=1;
// cout<<1<<" ";
}
// w=1;
break;
}
}
}
// cout<<endl;
}
}
cout<<m-nu;
return 0;
}
最后得分:100pts
}
T4蜗牛老师的代码
{
思路:本人太菜了,老师讲过类似的一道题叫:肉夹馍,可是我还是不会,打了50暴力
正解:分治,找到规律后每次折半
#include<bits/stdc++.h>
using namespace std;
long long a[110];
int main()
{
freopen("code.in","r",stdin);
freopen("code.out","w",stdout);
string s;
int n;
cin>>s>>n;
long long maxx=s.size();
for(int i=1;i<=n;i++){
long long x;
cin>>x;
while(maxx<x){
long long maxx2=maxx;
while(x>2*maxx2) maxx2*=2;
x-=(maxx2+1);
if(x==0) x=maxx2;
}
printf("%c\n",s[x-1]);
}
// AB BA ABB AA ABB
return 0;
}
最后得分 50pts
}
T5蜗牛老师的跳跃
{
本人很菜,打了一个广搜,果断爆0,klz大佬A掉了!!,%%%%%
其实这道题广搜和DP都可以但是我广搜订正时只拿了40pts,所以就把DP代码发一下
#include<bits/stdc++.h>
using namespace std;
struct made{
int up;//上升时间
int dowm;//下降时间
int sum;//循环时间
}a[10000];
bool f[1100][1100];
int main()
{
freopen("jump.in","r",stdin);
freopen("jump.out","w",stdout);
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n;
cin>>n;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
f[0][0]=1;
for(int j=1;j<=n;j++){
scanf("%d%d",&a[j].up,&a[j].dowm);
a[j].sum=a[j].up+a[j].dowm;
}
bool bol=1;
for(int tim=0;tim<=1100&&bol==1;tim++){
for(int wei=0;wei<=n+1;wei++){
if(wei==n+1){
if(f[wei][tim]){
cout<<tim<<endl;
bol=0;
break;
}
}
if(f[wei][tim]){
for(int mov=-5;mov<=5;mov++){
int nex=wei+mov;
if(nex>=0&&nex<=n+1){
int nti=tim+1;
if((nex==n+1)||(nex==0)||(nti%a[nex].sum>=1&&nti%a[nex].sum<=a[nex].up)){
f[nex][nti]=1;
}
}
}
}
}
}
if(bol)
cout<<"No"<<endl;
}
return 0;
}
最后得分 0pts
没有加注解,但是各位大佬肯定能看懂
}