数字游戏
#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;
}
这道题我当时是做出来的,不过在这个点上稍微浪费了一点时间。
公交换乘
#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;
}
这道题没做出来是真的可惜,简单题想的太复杂了!
纪念品
#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;
}
这道题其实还是情有可原的,不过仔细想也是想的出来的。
加工零件
# 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(一等奖),所以还是那句话: