1001.
分析:简单题,模拟一下就好了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int a[102];
int main()
{
// ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int i=0;
while(a[i]==0&&i<n)i++;
int ans;
if(i<n)ans=1;
else {
cout<<"0"<<endl;
return 0;
}
int f=0;
for(int j=i+1;j<n;j++){
if(a[j]==0){ans++;f++;}
else if(a[j]==1){
if(f>=2)ans-=f;
f=0;
ans++;
}
}
for(int j=n-1;j>=0;j--){
if(a[j]==0)ans--;
else break;
}
cout<<ans<<endl;
return 0;
}
1002.
题意:L要去超市,可以在上下两排走,中间要经过大街,经过大街的那条路不能走第二次,问最短路径。
分析:刚那个看到这题,以为是bfs求最短路,想了一会发现只需上下走一遍,再加上中间穿过的等待时间就好了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int a[52],aa[52];
int b[55],n,maxn;
void bfs()
{
int ans=0,sum=0;
for(int i=n-1;i>=0;i--){
ans=0;
ans+=sum;
ans+=b[i];
if(i>0)
sum+=aa[i];
for(int j=i;j>0;j--){
ans+=a[j];
}
int san=0;
for(int k=0;k<n;k++){
int anss=0;
anss+=san;
if(k<n-1)
san+=a[k+1];
if(k==i)continue;
anss+=b[k];
for(int z=k+1;z<n;z++)
anss+=aa[z];
maxn=min(anss+ans,maxn);
}
}
}
int main()
{
cin>>n;
for(int j=1;j<n;j++){
cin>>a[j];
}
for(int j=1;j<n;j++){
cin>>aa[j];
}
for(int i=0;i<n;i++)
cin>>b[i];
maxn=2000000000;
bfs();
cout<<maxn<<endl;
}
1003
分析:构造一个结构体,表示第i个小孩的相关信息,一个队列放入能够看病的小孩,vis数组标记某个小孩是否还在排队。接下来就是模拟了。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct point
{
int v,d,p,nul; //改成long long可AC
}a[4005];
bool vis[4005];
int main()
{
// ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].v>>a[i].d>>a[i].p;
a[i].nul=i;
}
queue<point> q;
// queue<point>::iterator it;
q.push(a[1]);
memset(vis,0,sizeof(vis));
vis[1]=1;
while(true){
point pos=q.back(); //正在看病的小孩
for(int i=pos.nul+1;i<=n;i++){
if(pos.v<=0)break;
if(!vis[i]){ //还在排队的要减去小孩的v值
a[i].p-=pos.v;
pos.v--; //v值每次减弱
}
}
for(int i=1;i<=n;i++){
if(a[i].p<0&&!vis[i]){ //耐心p小于0的跑掉
vis[i]=1;
for(int j=i+1;j<=n;j++){
if(!vis[j]) //他后边的所有排队的人都耐心值减去di。
a[j].p-=a[i].d;
}
}
}
bool flag=false;
for(int i=1;i<=n;i++){ //等到安静以后,找第一个还在排队的人键入队列,去看病。
if(!vis[i]){
q.push(a[i]);
vis[i]=1;
flag=true;
break;
}
}
if(!flag)break; //如果没有排队的人了,退出循环
}
cout<<q.size()<<endl;
cout<<q.front().nul;
q.pop();
while(!q.empty()){
cout<<' '<<q.front().nul;
q.pop();
}
cout<<endl;
}
上面代码终测试错了,原因是 p值减去一些v和d后,可能会爆int,只要把数据改成long long 就好了,哎,好悲伤,这个错找了好久,因为给的数据范围是10^6,根本没考虑数据情况,吃一堑长一智,以后还要好好考虑数据范围啊。
后来经过我无数次改错,找到了一个更简短的解法
#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct point
{
LL v,d,p,nul;
}a[4005];
bool vis[4005];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].v>>a[i].d>>a[i].p;
a[i].nul=i;
}
queue<point> q;
LL vd,vh;
for(int i=1; i<=n; i++)
{
if(a[i].p>=0)
{
q.push(a[i]);
vd = a[i].v; //vd表示正在看病的人的哭声杀伤力v
vh=0; //vh表示吓跑的小孩的杀伤力d
for(int j=i+1; j<=n; j++)
{
if(a[j].p>=0)
{
a[j].p-= (vd+vh);
vd = max(0LL,vd-1);
if(a[j].p<0)
vh+=a[j].d;
}
}
}
}
cout<<q.size()<<endl;
cout<<q.front().nul;
q.pop();
while(!q.empty()){
cout<<' '<<q.front().nul;
q.pop();
}
cout<<endl;
return 0;
}