数字游戏

codecode

#include <bits/stdc++.h>
using namespace std;
char c[20];
int ans = 0;
int main()
{
    //freopen("number.in", "r", stdin);//freopen
    //freopen("number.out", "w", stdout);//freopen
    scanf("%s", c+1);
    for(int i = 1; i <= strlen(c + 1); i++)
        if(c[i] == '1') ans++;
    printf("%d",ans);
    //fclose(stdin);//fclose
    //fclose(stdout);//fclose
    return 0;
}

这道题我当时是做出来的,不过在strlenstrlen这个点上稍微浪费了一点时间。

公交换乘

#include<bits/stdc++.h>
using namespace std;
struct zx
{
    int tim,v;
}ti[100001];
int n,ans=0,used=1,nw=0,val,t,k;
int main()
{
    //freopen("transfer.in","r",stdin);
    //freopen("transfer.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d %d",&k,&val,&t);
        while(used<=nw&&t-ti[used].tim>45)used++;ans+=val;
        if(k==0)ti[++nw].tim=t,ti[nw].v=val;
            else for(int j=used;j<=nw;j++)
                if(ti[j].v>=val){ti[j].v=0,ans-=val;break;}
    }
    printf("%d",ans);
    return 0;
}

这道题没做出来是真的可惜,简单题想的太复杂了!

纪念品

codecode

#include<bits/stdc++.h>
using namespace std;
const int MAXN = (int) 1e2 + 10;

int t, n, m, a[MAXN][MAXN];
int w[MAXN], v[MAXN];
int dp[MAXN*MAXN];

int main() {
    //freopen("souvenir.in", "r", stdin);
    //freopen("souvenir.out", "w", stdout);
    scanf("%d%d%d", &t, &n, &m);
    for (int i=1; i<=t; i++) {
        for (int j=1; j<=n; j++)
            scanf("%d", &a[i][j]);
    }
    for (int i=1; i<t; i++) {
        for (int j=1; j<=n; j++) {
            v[j] = a[i][j];
        }
        for (int j=1; j<=n; j++) {
            w[j] = a[i+1][j];
        }
        for (int j=0; j<=m; j++)
            dp[j] = 0;
        for (int j=1; j<=n; j++) {
            for (int k=m; k>=v[j]; k--)
                dp[k-v[j]] = max(dp[k-v[j]], dp[k] + w[j]);
        }
        int ans = 0;
        for (int j=0; j<=m; j++) {
            ans = max(ans, dp[j] + j);
        }
        m = ans;
    }
    printf("%d\n", m);
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

这道题其实还是情有可原的,不过仔细想也是想的出来的。

加工零件

codecode

# include <bits/stdc++.h>
# define rr register
const int N=100010;
struct Edge{
    int to,next;
}edge[N<<1];
struct Node{
    int id,w;
};
int head[N],sum;
int dis[N][2];
int n,m,q;
std::queue <Node> Q;
inline int read(void){
    int res,f=1;
    char c;
    while((c=getchar())<'0'||c>'9')
        if(c=='-')f=-1;
    res=c-48;
    while((c=getchar())>='0'&&c<='9')
        res=res*10+c-48;
    return res*f;       
}
inline void add(int x,int y){
    edge[++sum].to=y;
    edge[sum].next=head[x];
    head[x]=sum;
    return;
}
inline void bfs(void){
    Q.push((Node){1,0});
    while(!Q.empty()){
        Node tmp=Q.front();
        Q.pop();
        for(rr int j=head[tmp.id];j;j=edge[j].next){
            if(~dis[edge[j].to][(tmp.w+1)%2])
                continue;
            dis[edge[j].to][(tmp.w+1)%2]=tmp.w+1;   
            Q.push((Node){edge[j].to,tmp.w+1}); 
        }
    }
    return;
}
int main(void){
    n=read(),m=read(),q=read();
    for(rr int i=1,x,y;i<=m;++i){
        x=read(),y=read();
        add(x,y),add(y,x);
    }
    memset(dis,-1,sizeof(dis));
    bfs();
    int x,L;
    while(q--){
        x=read(),L=read();
        if(dis[x][(L%2)]>L||dis[x][(L%2)]==-1)
            puts("No");
        else
            puts("Yes");    
    }
    return 0;
}

T4还是问题最大的,自己回家做也只做了95pts,不过也很不错了,这道题毕竟比赛时一点思路也没有。

总结

这次CSP算是一次练习吧,不过也拿了一个二等奖。T1做对是理所当然的,T2、T3有点可惜,T4不想说什么
比赛分数:100pts
获得奖项:二等奖
家中自测:395pts(满分400pts)
其实可以看到,家中自测是395pts(一等奖),所以还是那句话:

实力是有的,要稳住,稳住!