CSPJ2019A. 数字游戏 (Number Games)
题目描述
小 K 同学向小 P 同学发送了一个长度为 888 的 010101 字符串来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 111。
注意:010101 字符串为每一个字符是 000 或者 111 的字符串,如 101
(不含双引号)为一个长度为 333 的 010101 字符串。
输入格式
输入文件只有一行,一个长度为 888 的 010101 字符串 sss。
输出格式
输出文件只有一行,包含一个整数,即 010101 字符串中字符 111 的个数。
数据范围与提示
对于 20%20\%20% 的数据,保证输入的字符全部为 000。
对于 100%100\%100% 的数据,输入只可能包含字符 000 和字符 111,字符串长度固定为 888。
#include<bits/stdc++.h>
using namespace std;
long long q,w,e,r,t,y,u,i,o,p,s,d,f,g,h,j,k,l,m,n,v,x,z,kk;
int b[1000];
int a[1000];
int c[1000];
char cc;
int main()
{
for(i=1;i<=8;i++)
{
cin>>cc;
if(cc=='1')
k++;
}
cout<<k;
return 0;
}
CSPJ2019B 公交换乘 (Bus Transfer)
题目描述
著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:
- 在搭乘一次地铁后可以获得一张优惠票,有效期为 454545 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指 开始乘公交车的时间与开始乘地铁的时间之差小于等于 454545 分钟,即:tbus−tsubway≤45t_{bus}-t_{subway} \le 45tbus−tsubway≤45。
- 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
- 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?
输入格式
输入文件的第一行包含一个正整数 nnn,代表乘车记录的数量。
接下来的 nnn 行,每行包含 333 个整数,相邻两数之间以一个空格分隔。第 iii 行的第 111 个整数代表第 iii 条记录乘坐的交通工具,000 代表地铁,111 代表公交车;第 222 个整数代表第 iii 条记录乘车的票价 priceiprice_ipricei ;第三个整数代表第 iii 条记录开始乘车的时间 tit_iti (距 000 时刻的分钟数)。
我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。
输出格式
输出文件有一行,包含一个正整数,代表小轩出行的总花费
第一条记录,在第 3 分钟花费 10 元乘坐地铁。
第二条记录,在第 46 分钟乘坐公交车,可以使用第一条记录中乘坐地铁获得的优惠票,因此没有花费。
第三条记录,在第 50 分种花费 12 元乘坐地铁。
第四条记录,在第 96 分钟乘坐公交车,由于距离第三条记录中乘坐地铁已超过 45分钟,所以优惠票已失效,花费 3 元乘坐公交车。
第五条记录,在第 110 分钟花费 5 元乘坐地铁。
第六条记录,在第 135 分钟乘坐公交车,由于此时手中只有第五条记录中乘坐地铁获得的优惠票有效,而本次公交车的票价为 6 元,高于第五条记录中地铁的票价 5 元,所以不能使用优惠票,花费 6 元乘坐公交车。
总共花费 36 元。
第一条记录,在第 1 分钟花费 5 元乘坐地铁。
第二条记录,在第 16 分钟花费 20 元乘坐地铁。
第三条记录,在第 23 分钟花费 7 元乘坐地铁。
第四条记录,在第 31 分钟乘坐公交车,此时只有第二条记录中乘坐的地铁票价高于本次公交车票价,所以使用第二条记录中乘坐地铁获得的优惠票。
第五条记录,在第 38 分钟乘坐公交车,此时第一条和第三条记录中乘坐地铁获得的优惠票都可以使用,使用获得最早的优惠票,即第一条记录中乘坐地铁获得的优惠票。
第六条记录,在第 68 分钟乘坐公交车,使用第三条记录中乘坐地铁获得的优惠票。
总共花费 32 元。
数据范围与提示
对于 30%30\%30% 的数据,n≤1000n \le 1000n≤1000,ti≤106t_i \le 10^6ti≤106。
另有 15%15\%15% 的数据,ti≤107t_i \le 10^7ti≤107,priceiprice_ipricei都相等。
另有 15%15\%15% 的数据,ti≤109t_i \le 10^9ti≤109,priceiprice_ipricei都相等。
对于 100%100\%100% 的数据,n≤105n \le 10^5n≤105,ti≤109t_i \le 10^9ti≤109,1≤pricei≤10001 \le price_i \le 10001≤pricei≤1000。
#include<bits/stdc++.h>
using namespace std;
int opt,n,t[100001],p[100001],ans,top,m=1,yh[100001],sj[100001],k;
bool r[100001];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>opt>>p[i]>>t[i];
if(opt==0) yh[++top]=p[i],sj[top]=t[i],ans+=p[i];
else{
k=0;
for(int j=m;j<=top;j++){
if(r[j]) continue;
if(t[i]-sj[j]>45) m=j;
else if(yh[j]>=p[i]){
k=j;
r[k]=true;
break;
}
}
if(!k) ans+=p[i];
}
}///test
cout<<ans;
}
CSPJ2019C. 纪念品 (Souvenir)
题目描述
小伟突然获得一种超能力,他知道未来 TTT 天 NNN 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。
每天,小伟可以进行以下两种交易无限次:
- 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
- 卖出持有的任意一个纪念品,以当日价格换回金币。
每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。
TTT 天之后,小伟的超能力消失。因此他一定会在第 TTT 天卖出所有纪念品换回金币。
小伟现在有 MMM 枚金币,他想要在超能力消失后拥有尽可能多的金币。
输入格式
第一行包含三个正整数 TTT, NNN, MMM,相邻两数之间以一个空格分开,分别代表未来天数 TTT,纪念品数量 NNN,小伟现在拥有的金币数量 MMM。
接下来 TTT 行,每行包含 NNN 个正整数,相邻两数之间以一个空格分隔。第 iii 行的 NNN 个正整数分别为 Pi,1P_{i,1}Pi,1,Pi,2P_{i,2}Pi,2 , ...... , Pi,NP_{i,N}Pi,N, 其中 Pi,jP_{i,j}Pi,j 表示第 iii 天第 jjj 种纪念品的价格。
输出格式
输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。
最佳策略是:
第二天花光所有 100100100 枚金币买入 555 个纪念品 111;
第三天卖出 555 个纪念品 111,获得金币 125125125 枚;
第四天买入 666 个纪念品 111,剩余 555 枚金币;
第六天必须卖出所有纪念品换回 300300300 枚金币,第四天剩余 555 枚金币,共 305305305 枚金币。
超能力消失后,小伟最多拥有 305305305 枚金币。
最佳策略是:
第一天花光所有金币买入 101010 个纪念品 111;
第二天卖出全部纪念品 111 得到 150150150 枚金币并买入 888 个纪念品 222 和 111 个纪念品 333,剩余 111 枚金币;
第三天必须卖出所有纪念品换回 216216216 枚金币,第二天剩余 111 枚金币,共 217217217 枚金币。
超能力消失后,小伟最多拥有 217217217 枚金币。
数据范围与提示
对于 10%10\%10% 的数据,T=1T = 1T=1。
对于 30%30\%30% 的数据,T≤4,N≤4,M≤100T \le 4, N \le 4, M \le 100T≤4,N≤4,M≤100,所有价格 10≤Pi,j≤100110 \le P_{i,j} \le 100110≤Pi,j≤1001 。
另有 15%15\%15% 的数据,T≤100,N=1T \le 100, N = 1T≤100,N=1。
另有 15%15\%15% 的数据,T=2,N≤100T = 2,N \le 100T=2,N≤100。
对于 100%100\%100% 的数据,T≤100,N≤100,M≤103T \le 100, N \le 100, M \le 10^3T≤100,N≤100,M≤103,所有价格 1≤Pi,j≤1041 \le P_{i,j} \le 10^4 1≤Pi,j≤104,数据保证任意时刻,小明手上的金币数不可能超过 10410^4104。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 105;
//dp[k]表示手里剩k元现金的时候,明天早上都卖了以后的钱数
//price[i][j]表示第i天第j件物品的价格
int dp[10005], price[MAXN][MAXN];
int main() {
int t, n, m, ans;
scanf("%d%d%d", &t, &n, &m);
//先输入
for (int i = 1; i <= t; ++i) {
for (int j = 1; j <= n; ++j) {
scanf("%d", &price[i][j]);
}
}
//第一天早上手里有m元
ans = m;
for (int i = 1; i < t; ++i) {
//先把数组赋值为负无穷
memset(dp, ~0x3f, sizeof(dp));
//什么都不买,今天早上有ans元,明天早上也是ans元
dp[ans] = ans;
//枚举第j个物品
for (int j = 1; j <= n; ++j) {
//手里有k元的时候,去推明天早上的钱
for (int k = ans; k >= price[i][j]; --k) {
//买一件物品,现金减少,赚一份差价,完全背包倒着循环
dp[k - price[i][j]] = max(dp[k - price[i][j]], dp[k] + price[i + 1][j] - price[i][j]);
}
}
//找一下明天早上收益最大
int ma = 0;
for (int j = 0; j <= ans; ++j) {
ma = max(ma, dp[j]);
}
//明天早上就有这么多钱了,继续赚钱
ans = ma;
}
cout << ans << endl;
return 0;
}
CSPJ2019D. 零件加工 (Parts Processing)
题目描述
凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 nnn 位工人,工人们从 1∼n1 \sim n1∼n 编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。
如果 xxx 号工人想生产一个被加工到第 L(L>1)L (L \gt 1)L(L>1) 阶段的零件,则所有与 xxx 号工人有传送带直接相连的工人,都需要生产一个被加工到第 L−1L - 1L−1 阶段的零件(但 xxx 号工人自己无需生产第 L−1L - 1L−1 阶段的零件)。
如果 xxx 号工人想生产一个被加工到第 111 阶段的零件,则所有与 xxx 号工人有传送带直接相连的工人,都需要为 xxx 号工人提供一个原材料。
轩轩是 111 号工人。现在给出 qqq 张工单,第 iii 张工单表示编号为 aia_iai 的工人想生产一个第 LiL_iLi阶段的零件。轩轩想知道对于每张工单,他是否需要给别人提供原材料。他知道聪明的你一定可以帮他计算出来!
输入格式
第一行三个正整数 nnn,mmm 和 qqq,分别表示工人的数目、传送带的数目和工单的数目。
接下来 mmm 行,每行两个正整数 uuu 和 vvv,表示编号为 uuu 和 vvv 的工人之间存在一条零件传输带。保证 u≠vu \neq vu=v。
接下来 qqq 行,每行两个正整数 aaa 和 LLL,表示编号为 aaa 的工人想生产一个第 LLL 阶段的零件。
输出格式
共 qqq 行,每行一个字符串 Yes
或者 No
。'
如果按照第 iii 张工单生产,需要编号为 111 的轩轩提供原材料,则在第 iii 行输出 Yes
;否则在第 iii 行输出 No
。
编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。
编号为 2 的工人想生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。
编号为 3 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。
编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。
编号为 2 的工人想生产第 2 阶段的零件,需要编号为 1 和 3 的工人生产第 1 阶段的零件,他/她们都需要编号为 2 的工人提供原材料。
编号为 3 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。
编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 和 5 的工人提供原材料。
编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 和 5 的工人生产第 1 阶段的零件,需要编号为 1,3,4 的工人提供原材料。
编号为 1 的工人想生产第 3 阶段的零件,需要编号为 2 和 5 的工人生产第 2 阶段第10页共10页的零件,需要编号为 1,3,4 的工人生产第 1 阶段的零件,需要编号为 2,3,4,5 的工人提供原材料。
编号为 1 的工人想生产第 4 阶段的零件,需要编号为 2 和 5 的工人生产第 3 阶段的零件,需要编号为 1,3,4 的工人生产第 2 阶段的零件,需要编号为 2,3,4,5 的工人生产第 1 阶段的零件,需要全部工人提供原材料。
编号为 1 的工人想生产第 5 阶段的零件,需要编号为 2 和 5 的工人生产第 4 阶段的零件,需要编号为 1,3,4 的工人生产第 3 阶段的零件,需要编号为 2,3,4,5 的工人生产第 2 阶段的零件,需要全部工人生产第 1 阶段的零件,需要全部工人提供原材料。
数据范围与提示
共 202020 个测试点。
- 1≤u,v,a≤n1 \le u, v, a \le n 1≤u,v,a≤n
测试点 1∼41 \sim 41∼4 , 1≤n,m≤1000,q=3,L=11 \le n, m \le 1000, q = 3,L = 1 1≤n,m≤1000,q=3,L=1。
测试点 5∼85 \sim 85∼8 , 1≤n,m≤1000,q=3,1≤L≤101 \leq n, m \le 1000, q = 3,1 \le L \le101≤n,m≤1000,q=3,1≤L≤10。
测试点 9∼129 \sim 129∼12 , 1≤n,m,L≤1000,1≤q≤1001 \leq n, m, L \le 1000, 1 \le q \le 1001≤n,m,L≤1000,1≤q≤100
测试点 13∼1613 \sim 1613∼16, 1≤n,m,L≤1000,1≤q≤1051 \le n, m, L \le 1000, 1 \le q \leq 10^51≤n,m,L≤1000,1≤q≤105
测试点 17∼2017 \sim 2017∼20, 1≤n,m,q≤105,1≤L≤1091 \le n, m, q \le 10^5 , 1 \le L \leq 10^91≤n,m,q≤105,1≤L≤109 。
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
template<typename T>void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}
vector<int>v[100010];
int ji[100010],ou[100010];
void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
for(int i=0;i<v[1].size();i++){
ji[v[1][i]]=1;
q.push(make_pair(v[1][i],1));
}
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}
int main(){
int n,m,q;
read(n);read(m);read(q);
for(int i=1;i<=m;i++){
int x,y;
read(x);read(y);//无向边
v[x].push_back(y);//连边
v[y].push_back(x);//连边
}
bfw();//跑最短路
while(q--){
int x,y;
read(x);read(y);
if(y%2==0){
if(ou[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}else{
if(ji[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}
}
return 0;
}