CSP-2
29-2垦田计划——二分
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
const int N=1e5+10;
struct p{
int t,c;
}a[N];
bool check(int x)
{
int sum=0;
for(int i=0;i<n;i++)
if(a[i].t>x) sum+=(a[i].t-x)*a[i].c;
if(sum>m) return false;
return true;
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>a[i].t>>a[i].c;
int l=k,r=1e5;
while(l<r)
{
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l;
}
28-2训练计划
20%
#include<iostream >
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int a[N],b[N],c[N];
int main()
{
int n,m;
cin>>m>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++)
{
if(a[i]==0) c[i]=1;
else
{
if(a[i-1]==0) //不加if 语句70%
c[i]=b[a[i]-1]+1;
else
c[i]=b[a[i]-1]+c[a[i]-1];
}
}
for(int i=0;i<n;i++) cout<<c[i]<<" ";
}
70%
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=400;
struct p{
int f,h;
}a[N];
int n,m;
int s[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>a[i].f;
for(int i=1;i<=m;i++) cin>>a[i].h;
//最早
for(int i=1;i<=m;i++)
if(a[i].f==0) s[i]=1;
else s[i]=s[a[i].f]+a[a[i].f].h;
for(int i=1;i<=m;i++) cout<<s[i]<<" ";
}
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
struct{
int pre;
int t;
int ne;
int nt;//之后需要的时间
}a[N];
int n,m;
int b[N],c[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>a[i].pre;
for(int i=1;i<=m;i++)
cin>>a[i].t;
for(int i=m;i>=1;i--)
{
if(a[i].pre)
{
a[a[i].pre].ne=i;
a[a[i].pre].nt=max(a[i].nt+a[i].t,a[a[i].pre].nt); //max
}
}
for(int i=1;i<=m;i++)
{
if(a[i].pre==0)
c[i]=1;
else c[i]=c[a[i].pre]+a[a[i].pre].t;
}
for(int i=1;i<=m;i++ ) cout<<c[i]<<' ';
bool success=1;
for(int i=1;i<=m;i++)
{
b[i]=n-a[i].nt-a[i].t+1;
if(b[i]<=0) success=false;
}
if(success)
{
cout<<endl;
for(int i=1;i<=m;i++) cout<<b[i]<<' ';
}
}
27-2何以包邮
新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P
初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n
)的价格为 ai元。考虑到预算有限,在最终付款前小 P
决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。
试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?输入格式输入的第一行包含空格分隔的两个正整数 n 和 x,分别表示购物车中图书数量和包邮条件。
接下来输入 n 行,其中第 i 行(1≤i≤n)仅包含一个正整数 ai,表示购物车中第 i 本书的价格。输入数据保证 n本书的价格总和不小于 x。
输出格式
仅输出一个正整数,表示在满足包邮条件下的最小花费。
数据范围
70% 的测试数据满足:n≤15;全部的测试数据满足:n≤30,每本书的价格 ai≤104 且 x≤a1+a2+⋯+an。
输入样例1:
4 100
20
90
60
60
输出样例1:
110
样例1解释
购买前两本书 (20+90)
即可包邮且花费最小。
输入样例2:
3 30
15
40
30
输出样例2:
30
样例2解释
仅购买第三本书恰好可以满足包邮条件。
输入样例3:
2 90
50
50
输出样例3:
100
样例3解释
必须全部购买才能包邮。
70%
方法一:数据70%可过
通过暴力枚举的方法,采用二进制
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=34;
int a[N];
int main()
{
int n,x; cin>>n>>x;
for(int i=0;i<n;i++) cin>>a[i];
int res=1e8;
for(int i=0;i< 1<<n;i++) //枚举0~2^n-1
{ // 1<<2 1的二进制为0000 0001左移2位 0000 0100.
int sum=0;
for(int j=0;j<n;j++) //注意是j<n
if(i>>j&1) sum+=a[j];
if(sum>=x) res=min(res,sum);
}
cout<<res<<endl;
}
方法二:数据70%可过
采用爆搜的方法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=34;
int a[N];
int n,x;
int res=1e8;
void dfs(int u,int sum)
{
if(u==n)
{
if(sum>=x) res=min(res,sum);
}
else{
//不选
dfs(u+1,sum);
//选
dfs(u+1,sum+a[u]);
}
}
int main()
{
cin>>n>>x;
for(int i=0;i<n;i++) cin>>a[i];
dfs(0,0);
cout<<res<<endl;
}
100% 01背包问题
全部购买为sum,总价值不小于x,sum-x的值尽量大,则满足题意
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=33;
const int M=300010; //注意取值范围
int w[N],f[N][M];
int n,x,sum;
int main()
{
cin>>n>>x;
for(int i=1;i<=n;i++)
{
cin>>w[i];
sum+=w[i];
}
int v=sum-x; //总容积
f[0][0]=0; //从第i-1中选,总价格不大于j
for(int i=1;i<=n;i++)
{
for(int j=1;j<=v;j++)
{
if(j<w[i]) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+w[i]);
// cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<endl;
}
}
cout<<sum-f[n][v]<<endl; //输出sum减背包最大值
}
26-2寻宝大冒险
100%
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int ,int > PII;
const int N=1010,M=60,INF=1e8;
PII a[N];
int b[M][M];
int n,L,s,res;
int main()
{
cin>>n>>L>>s;
for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
int cnt=0;
for(int i=s;i>=0;i--)
for(int j=0;j<=s;j++)
{
cin>>b[i][j];
cnt+=b[i][j];
}
for(int i=0;i<n;i++)
{
int sum=0;
int x0=a[i].x,y0=a[i].y;
if(x0+s<=L&&y0+s<=L) //可以等于
{
for(int j=0;j<n;j++)
{
int x=a[j].x,y=a[j].y;
if(x>=x0&&y>=y0&&x-x0<=s&&y-y0<=s)
if(b[x-x0][y-y0]) sum++;
else sum=-INF; //注意!!!
}
}
if(sum==cnt) res++;
}
cout<<res;
}
25-2出行计划
70%
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N=10010;
typedef pair<int ,int> PII;
PII a[N];
int q[N];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
for(int i=0;i<m;i++) cin>>q[i];
for(int i=0;i<m;i++)
{
int res=0;
int t=q[i]+k;
for(int j=0;j<n;j++)
{
if(a[j].x>=t&&a[j].y+t>a[j].x) res++;
}
cout<<res<<endl;
}
}
100%差分
1e5:时间复杂度控制在o(nlogn)以内
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010; //注意:q的取值范围
int n,m,k;
int b[N];
int main()
{
scanf("%d%d%d",&n,&m,&k);
while(n--)
{
int t,c;
scanf("%d%d",&t,&c); //q+k<= t <=q+k+c-1
int l=t-k-c+1,r=t-k;
if(r>0) b[max(1,l)]++,b[r+1]--; //判断条件要有
}
for(int i=1;i<=N;i++) b[i]+=b[i-1]; //注意范围
while(m--)
{
int t;
scanf("%d",&t);
// return 0;
printf("%d\n",b[t]);
// return 0;
}
}
24-2序列查询新解
70%
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
const int N=1010;
int g[N],f[N],a[N];
int main()
{
cin>>n>>m;
int r=m/(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
int k=0,q=0;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
if(a[i]<=j) f[j]++;
for(int i=0;i<m;i++) g[i]=i/r;
int sum=0;
for(int i=0;i<m;i++) sum+=abs(f[i]-g[i]);
cout<<sum<<endl;
}
23-2非零段划分
60%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N],s[N];
int main()
{
int n;
int max=-1e8;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>max) max=a[i];
}
if(max==0)
{
cout<<"0"<<endl;
return 0;
}
int maxv=0;
for(int i=max;i>0;i--)
{
for(int j=0;j<n;j++) s[j]=a[j];
for(int j=0;j<n;j++)
if(a[j]<i) s[j]=0;
// for(int j=0;j<n;j++) cout<<s[j]<<" ";
// cout<<endl;
int sum=0;
if(s[0]!=0) sum=1;
else sum=0;
for(int j=1;j<n-1;j++)
{
if(s[j]==0&&s[j+1]!=0) sum++;
if(sum>maxv) maxv=sum;
}
// cout<<i<<" "<<sum<<endl;
}
cout<<maxv;
}
70%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
const int N=1e5;
int a[N],b[N];
int maxv=0;
int res;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]),maxv=max(maxv,a[i]);
for(int i=1;i<=maxv;i++)
{
for(int j=0;j<n;j++)
{
if(a[j]<i)
b[j]=0;
else b[j]=a[j];
}
// for(int j=0;j<n;j++) cout<<b[j]<<' '; cout<<endl;
int cnt=0;
int j=0;
while(j<n)
{
if(b[j]!=0) cnt++;
while(b[j]!=0) j++;
while(b[j]==0) j++;
}
// cout<<cnt<<endl;
if(cnt>res) res=cnt;
}
cout<<res;
}
**前缀和,差分
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5*1e5;
int n;
int a[N],b[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>a[i-1])//后一个数比前一个数大,p取它们中间值的时候,就会出现一个非零段
{
b[a[i-1]]++;
b[a[i]]--;
}
}
int ans=0,t=0;
for(int i=0;i<N;i++)
{
t+=b[i];
ans=max(ans,t);
}
cout<<ans;
}
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=500010,M=10010;
int n,a[N],cnt[M];//每个高度为i的山峰的贡献
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
n=unique(a+1,a+n+1)-a-1;//去重
a[0]=a[n+1]=0;
for(int i=1;i<=n;i++)
{
int x=a[i-1],y=a[i],z=a[i+1];
if(x<y&&y>z) cnt[y]++;//山峰
else if(x>y&&y<z) cnt[y]--;//山谷
}
int res=0,sum=0;
for(int i=M-1;i;i--)
{
sum+=cnt[i];
res=max(res,sum);
}
cout<<res;
}
22-2邻域均值
100%
前缀和数组
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=610;
int a[N][N],s[N][N];
int n,l ,r,t;
int main()
{
cin>>n>>l>>r>>t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int x1=max(i-r,1),y1=max(j-r,1),x2=min(i+r,n),y2=min(j+r,n);
int sum=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
int q=(x2-x1+1)*(y2-y1+1);
if(sum/q<t||(sum/q==t&&sum%q==0)) //注意这个地方,或者转化为double类型
res++;
}
}
cout<<res;
}
21-2期末最佳阈值
40%
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int ,int>PII;
const int N=1e5+10;
PII a[N];
int res,maxv;
int main()
{
int m;
cin>>m;
for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y;
for(int j=1;j<=m;j++)
{
int cnt=0;
for(int i=1;i<=m;i++)
{
int q=a[j].x;
if(a[i].x>=q&&a[i].y==1) cnt++;
if(a[i].x<q&&a[i].y==0) cnt++;
}
cout<<cnt<<" ";
if(cnt>=maxv)
{
res=max(res,a[j].x);
maxv=cnt;
}
}
cout<<res;
}
70%
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=1e5+10;
int m;
struct p{
int t,res;
}a[N];
set<int>b;
int main()
{
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a[i].t>>a[i].res;
b.insert(a[i].t);
}
int maxv=0,maxid=0;
for(auto it=b.begin();it!=b.end();it++)
{
int x=*it;
int cnt=0;
for(int i=0;i<m;i++)
{
if(a[i].t>=x&&a[i].res==1) cnt++;
if(a[i].t<x&&a[i].res==0) cnt++;
}
if(cnt>=maxv)
{
maxv=cnt;
if(x>maxid) maxid=x;
}
}
cout<<maxid<<endl;
}
20-2风险人群筛查
*100% 连续
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
//连续k个点为逗留
using namespace std;
typedef pair<int ,int> PII;
const int N=1010;
PII a[N];
int n,k,t,xl,yd,xr,yu;
int main()
{
cin>>n>>k>>t>>xl>>yd>>xr>>yu;
int res1=0,res2=0;
while(n--)
{
bool s1=0,s2=0;
int cnt=0;
for(int i=0;i<t;i++)
{
cin>>a[i].x>>a[i].y;
if(a[i].x>=xl&&a[i].x<=xr&&a[i].y>=yd&&a[i].y<=yu)
{
s1=true;
cnt++;
}
else cnt=0;
if(cnt>=k) s2=true;
}
if(s2) res2++;
if(s1) res1++;
}
cout<<res1<<endl;
cout<<res2<<endl;
}
19-2稀疏向量
60%暴力
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,a,b;
int c[N],d[N];
int main()
{
cin>>n>>a>>b;
while(a--)
{
int x,y;
cin>>x>>y;
c[x]=y;
}
while(b--)
{
int x,y;
cin>>x>>y;
d[x]=y;
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=c[i]*d[i];
}
cout<<sum;
}
100%**双指针
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef long long int LL;
typedef pair<int ,int> PII;
const int N=5*1e5+10;
int n,m;
PII a[N],b[N];
LL res; //范围
int main()
{
scanf("%*d%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=0;i<m;i++) scanf("%d%d",&b[i].x,&b[i].y);
for(int i=0,j=0;i<n&&j<m;i++)
{
while(j<m&&b[j].x<a[i].x) j++;
if(j<m&&a[i].x==b[j].x) res+=(LL)a[i].y*b[j].y;
}
cout<<res;
}
18-2 回收站选址
50%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
int n;
int cnt[5];
bool st[N][N];
int dx[4]={-1,1,-1,1},dy[4]={-1,-1,1,1};
bool check(int x,int y)
{
int dx1[4]={-1,1,0,0},dy1[4]={0,0,-1,1};
for(int i=0;i<4;i++)
{
int sx=x+dx1[i],sy=y+dy1[i];
if(!st[sx][sy]) return false;
}
return true;
}
int main()
{
cin>>n;
while(n--)
{
int x,y;
cin>>x>>y;
st[x][y]=true;
}
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
{
if(st[i][j]&&check(i,j))
{
int res=0;
for(int k=0;k<4;k++)
{
int x1=i+dx[k],y1=j+dy[k];
if(st[x1][y1]) res++;
}
cnt[res]++;
}
}
for(int i=0;i<5;i++)
cout<<cnt[i]<<endl;
}
100%
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
PII q[N];
int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};
int n;
int cnt[5];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>q[i].x>>q[i].y;
for(int i=0;i<n;i++)
{
int s[8]={0};
for(int j=0;j<n;j++)
for(int k=0;k<8;k++)
if(q[i].x+dx[k]==q[j].x&&q[i].y+dy[k]==q[j].y)
s[k]++;
if(s[1]&&s[3]&&s[5]&&s[7])
cnt[s[0]+s[2]+s[4]+s[6]]++;
}
for(int i=0;i<5;i++)
cout<<cnt[i]<<endl;
}
17-2 小明种苹果(续)
70%
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,T,D,E;
const int N=1010;
bool st[N];
vector<int> a[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x; cin>>x;
a[i].push_back(x);
while(x--)
{
int c; cin>>c;
a[i].push_back(c);
}
}
for(int i=0;i<n;i++)
{
int sum=0;
for(int j=a[i][0];j>=1;j--)
{
sum+=a[i][j];
if(a[i][j]>0) break;
}
T+=sum;
int cnt=a[i][1];
for(int j=2;j<=a[i][0];j++)
{
if(a[i][j]>0 )
{
if(a[i][j]!=cnt)
{
st[i]=1;D++;
}
break;
}
cnt+=a[i][j];
}
}
st[n]=st[0],st[n+1]=st[1];
int cnt=0;
for(int i=0;i<n+2;i++)
{
if(st[i]) cnt++;
if(cnt>=3) E++;
if(!st[i]) cnt=0;
}
cout<<T<<" "<<D<<" "<<E<<endl;
}
50%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N][N];
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i][0];
for(int j=1;j<=a[i][0];j++)
cin>>a[i][j];
}
int cntD=0,cntE=0;
int cntT=0,cnt=0;
for(int i=0;i<n;i++)
{
int sum=a[i][1];
bool flag=0;
for(int j=2;j<=a[i][0];j++)
{
if(a[i][j]<=0) sum+=a[i][j];
else
{
if(sum!=a[i][j]) flag=1;
sum=a[i][j];
}
}
cntT+=sum;
if(flag) cnt++;
if(cnt>=3) cntE++;
if(!flag) cnt=0;
if(flag) cntD++;
}
cout<<cntT<<' '<<cntD<<' '<<cntE;
}
16-2二十四点
40%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>s;
int res=s[0]-'0';
for(int i=1;s[i]!='\0';i=i+2)
{
if(s[i]=='-')
res=res-s[i+1]+'0';
else res=res+s[i+1]-'0';
}
if(res==24) puts("Yes");
else puts("No");
}
}
**100%
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<unordered_map>
using namespace std;
stack<int>num;
stack<char> op;
void eval()
{
int b=num.top();num.pop();
int a=num.top();num.pop();
char c=op.top();op.pop();
int x;
if(c=='+') x=a+b;
else if(c=='-') x=a-b;
else if(c=='x') x=a*b;
else
{
if(a*b>=0) //同号
x=a/b;
else //向下取整
{
if(a%b==0) x=a/b;
else x=a/b-1;
}
}
num.push(x);
}
int main()
{
int n;
cin>>n;
unordered_map <char,int>pr;
pr['+']=pr['-']=1;
pr['x']=pr['/']=2;
while(n--)
{
string str;
cin>>str;
num=stack<int>();// 清空
op=stack<char>();
for(auto c:str)
{
if(c>='0'&&c<='9') num.push(c-'0');
else
{
while(op.size()&&pr[op.top()]>=pr[c]) eval();
op.push(c);
}
}
while(op.size()) eval();
if(num.top()==24) puts("Yes");
else puts("No");
}
}
15-2小明放学
20%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct p{
int k,t;
}q[N];
int r,y,g;
int n;
int main()
{
cin>>r>>y>>g;
cin>>n;
for(int i=0;i<n;i++) cin>>q[i].k>>q[i].t;
long long sum=0;
for(int i=0;i<n;i++)
{
if(q[i].k==0) sum+=q[i].t;
if(q[i].k==1) //红
{
// int tt=sum-q[i].t;
int tt=tt%(r+y+g);
if(tt<=q[i].t) sum+=tt+y;
else if(tt<=y+q[i].t) sum+=tt;
}
if(q[i].k==2) //黄
{
int tt=sum-q[i].t;
tt=tt%(r+y+g);
if(tt>g+r) sum+=r+y-tt;
cout<<tt<<' '<<r+y-tt<<endl;
}
if(q[i].k==3) //绿
{
int tt=sum-q[i].t;
tt=tt%(r+y+g);
if(tt<=r+y) sum+=r+y-tt;
cout<<tt<<' '<<r+y-tt<<endl;
}
}
cout<<sum;
}
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int r,y,g;
int n;
long long int sumt;
int main()
{
cin>>r>>y>>g; //红,黄,绿;
cin>>n;
while(n--)
{
long long int k,t;
cin>>k>>t;
if(k==0) sumt+=t;
else{
if(k==1) //红灯
t=r-t;
if(k==2)
t=r+g+y-t;
if(k==3)
t=r+g-t;
t+=sumt;
t=t%(r+g+y);
if(t<r) sumt+=r-t;
if(t>=r+g) sumt+=r+g+y-t+r;
}
}
cout<<sumt;
}
14-2买菜
100% 题意
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int g[N],s[N]; //注意范围!!!!!
int n,res,maxv,minv=1e8;
int main()
{
scanf("%d",&n);
for(int i=0;i<2*n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a]++;
g[b]--;
minv=min(minv,a);
maxv=max(maxv,b);
}
for(int i=1;i<maxv;i++) s[i]=s[i-1]+g[i];
for(int i=minv;i<maxv;i++) //从0开始到M
if(s[i]==2) res++;
cout<<res;
}
*13-2碰撞的小球
*100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,L,t;
const int N=110;
struct ball{
int id,f;
}a[N];
int main()
{
cin>>n>>L>>t;
for(int i=0;i<n;i++)
{
cin>>a[i].id;
a[i].f=1;
}
while(t--)
{
for(int i=0;i<n;i++)
{
a[i].id+=a[i].f;
if(a[i].id==L||a[i].id==0)
a[i].f*=-1; //掉头
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(a[i].id==a[j].id)
{
a[i].f*=-1;
a[j].f*=-1;
}
}
}
for(int i=0;i<n;i++)
cout<<a[i].id<<' ';
}
12-2游戏-队列
100%*
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
queue<int> q;
for(int i=1;i<=n;i++) q.push(i);
int j=1;
while(q.size()>1)
{
int t=q.front();
q.pop();
if(j%k!=0&&j%10!=k) q.push(t);
j++;
}
cout<<q.front();
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
int main()
{
int n,k;
cin>>n>>k;
queue<PII>q;
for(int i=1;i<=n;i++) q.push({i,i});
while(q.size()>1)
{
PII t=q.front();
q.pop();
if(t.y%10!=k&&t.y%k!=0)
q.push({t.x,++n}); //n++ 就错误?{1,6} 不删除
}
PII m=q.front();
cout<<m.x;
}
11-2公共钥匙盒
10-2学生排队
100%
#include<iostream>
#include<cstring>
#include<cstring>
using namespace std;
int n,T;
const int N=1010;
int a[N];
int main()
{
cin>>n>>T;
for(int i=1;i<=n;i++) a[i]=i;
while(T--)
{
int a1,b;
cin>>a1>>b;
int k=0;
for(int i=1;i<=n;i++)
if(a[i]==a1)
k=i; //找到要交换的位置
if(b>0)
{
for(int i=0;i<b;i++)
swap(a[k+i],a[k+i+1]);
}
if(b<0)
{
b=-b;
for(int i=0;i<b;i++)
swap(a[k-i],a[k-i-1]);
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<' ';
}
*9-2工资计算
100%枚举/二分
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T;
int a[]={0,1500,4500,9000,35000,55000,80000,200000};
int b[]={0,3,10,20,25,30,35,45};
int get(int x)
{
if(x<=3500) return x;
int res=x-3500;
int tax=0;
for(int i=0;i<8;i++)
if(res>a[i])
tax+=(min(a[i+1],res)-a[i])/100*b[i+1];
else break;
return x-tax;
}
int main()
{
cin>>T;
for(int i=0;i<=200000;i+=100)
{
if(get(i)==T)
{
cout<<i<<endl;
break;
}
}
}
8-2火车购票
90%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
const int N=110;
int a[N];
int q[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int k=1;
for(int i=0;i<N;i++)
for(int j=1;j<=5;j++)
q[i][j]=k++;
for(int i=0;i<N;i++) q[i][0]=5;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=N;j++)
{
if(q[j][0]>=a[i])
{
q[j][0]-=a[i];
for(int k=1,cnt=1;cnt<=a[i];k++)
{
if(q[j][k]!=0)
{
cout<<q[j][k]<<' ';
q[j][k]=0;
cnt++;
}
}
cout<<endl;
break;
}
}
}
}
7-2俄罗斯方块
90%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=20;
int g[N][N],backup[N][N],g2[N][N];
int a[N][N];
int c;
bool check(int x)
{
memcpy(backup ,g,sizeof g);
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
backup[x+i][c+j]+=a[i][j];
if(backup[x+i][c+j]==2) return false;
}
}
memcpy(g2 ,backup,sizeof backup);
return true;
}
int main()
{
for(int i=0;i<15;i++)
for(int j=0;j<10;j++)
cin>>g[i][j];
for(int i=0;i<10;i++) //加一层地板
g[15][i]=1;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cin>>a[i][j];
cin>>c;
c--;
for(int i=0;i<15;i++)
{
if(!check(i))
{
for(int i=0;i<15;i++)
{
for(int j=0;j<10;j++) cout<<g2[i][j]<<' ';
cout<<endl;
}
return 0;
}
}
}
6-2消除类游戏
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int N=40;
int a[N][N],b[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
memcpy(b,a,sizeof a);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
//左右
int l=j,r=j;
int k=a[i][j];
while(a[i][r+1]==k&&r+1<=m) r++;
while(a[i][l-1]==k&&l-1>0) l--;
int p=i,d=i;
while(a[p-1][j]==k&&p-1>0) p--;
while(a[d+1][j]==k&&d+1<=n) d++;
//
if(r-l+1>=3)
{
// cout<<i<<' '<<l<<' '<<r<<endl;
for(int z=l;z<=r;z++)
b[i][z]=0;
}
if(d-p+1>=3)
{
for(int z=p;z<=d;z++)
b[z][j]=0;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<b[i][j]<<' ';
cout<<endl;
}
}
5-2日期计算
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int y,n;
int main()
{
cin>>y>>n;
int t=0;
if(y%4==0&&y%100!=0||y%400==0) t=1; //闰年
int sum=0,i=1;
while(sum<n)
{
sum+=d[t][i];
i++;
}
sum-=d[t][i-1];
cout<<i-1<<endl;
cout<<n-sum<<endl;
}
4-2数字排序
60%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
struct p{
int num,c;
bool operator<(const p&t)const{
if(t.c==c) return num<t.num;
else return t.c<c; //大到小
}
}a[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x; cin>>x;
a[x].num=x;
a[x].c++;
}
sort(a,a+n);
for(int i=0;i<n;i++)
if(a[i].num||a[i].c)
cout<<a[i].num<<' '<<a[i].c<<endl;
}
3-2*Z字形扫描
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
int a[N][N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=2;i<=2*n;i++)
{
if(i%2==0)// up
{
for(int j=1;j<i;j++)
if((i-j)>=1&&(i-j)<=n&&j>=1&&j<=n)
cout<<a[i-j][j]<<' ';
}
else
{
for(int j=1;j<i;j++)
if(j>=1&&j<=n&&(i-j)>=1&&(i-j)<=n)
cout<<a[j][i-j]<<' ';
}
}
}
2-2画图
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
bool st[N][N];
int n,res;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
for(int j=x1+1;j<=x2;j++)
for(int k=y1+1;k<=y2;k++)
st[j][k]=1;
}
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(st[i][j]) res++;
cout<<res;
}
1-2窗口
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int N=20;
struct p{
int id,x1,y1,x2,y2;
}a[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
a[i].id=i;
cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2;
}
while(m--)
{
int x,y;
cin>>x>>y;
p temp;
bool flag=0;
for(int i=n;i>=1;i--)
{
if(x>=a[i].x1&&x<=a[i].x2&&y>=a[i].y1&&y<=a[i].y2)
{
int t=i;
temp=a[t];
for(int k=t+1;k<=n;k++) a[k-1]=a[k];
a[n]=temp;
cout<<temp.id<<endl;
flag=1;
break;
}
}
if(flag==0) puts("IGNORED");
}
}
0-2ISBM号码
100%
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int main()
{
cin>>s;
int i=0,j=1,res=0;
int n=s.length()-1;
while(n--)
{
if(s[i]!='-')
{
res+=(s[i]-'0')*j;
j++;
}
i++;
}
res=res%11;
if(res==10)
{
if(s[12]=='X')puts("Right");
else
{
s[12]='X';
cout<<s;
}
}
else
{
if(res==s[12]-'0') puts("Right");
else
{
s[12]=res+'0';
cout<<s<<endl;
}
}
}