2021ccpc女生赛+补题

cf补题地址

A. 公交线路

思路:

记录上车站点两个方向按顺序听到的数,对给的m个站点数一一对比,若两个方向m个站点完全一样且与听到的m个站点数一样则无法判断,若两个方向m个站点不一样且正确的方向与听到的站点数一样则方向正确,否则,方向错误。

代码:

#include
#define ll long long
const int maxn=2e5+10;
using namespace std;
int a[maxn],res[maxn],b[maxn];
int main()
{
  int n,x,y,m,temp;
  vectorleft;
  vectorright;
  cin>>n>>x>>y;
  for(int i=1;i<=n;i++)cin>>a[i];
  cin>>m;
  for(int i=0;i>b[i];
  int t=max(x,y)-min(x,y);
  if(x=x-t;i--)left.push_back(a[i]);
  int tt=1;
  for(int i=0;i

C. 连锁商店

思路:

学姐补的。

代码:

#include
using namespace std;
const int N = 40;

int n,m,w[N],com[N],money[N],u,v,st[N],mp[N][N];
vector e[N];
int ans[N];

void dfs(int now,int sum)
{
	ans[now]=max(ans[now],sum);
	for(auto i: e[now])
	{
		if(st[com[i]]==0) 
		{
			st[com[i]]=1;
			dfs(i,sum+money[com[i]]);
			st[com[i]]=0;
		}
		else 
		{
			dfs(i,sum);
		}
	}
	
}

int main()
{
	
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&com[i]);
	for(int i=1;i<=n;i++) scanf("%d",&money[i]);	

	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		mp[u][v]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=j+1;k<=n;k++)
				if(mp[j][k]&&mp[j][i]&&mp[i][k])
					mp[j][k]=0;
	
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if(mp[i][j])
				e[i].push_back(j);
	ans[1]=money[com[1]];
	st[com[1]]=1;
	dfs(1,ans[1]);
	for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
  //system("pause");
	return 0;
}

D. 修建道路

思路:

不难发现,按顺序在相邻两地修建道路的总费用最小,每次修建费用:maxi≤k≤j{ak}。

代码:

#include
#define ll long long
const int maxn=2e5+10;
using namespace std;
int a[maxn],res[maxn],bit[maxn],n;
int main()
{
  int n;
  ll ans=0;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    if(i>1)ans+=max(a[i],a[i-1]);
  }
  printf("%lld\n",ans);
  //system("pause");
  return 0;
}

G. 3G网络

思路:

签到,当r无穷大时,整个图的面积和n个圆的面积比趋向1/n.

代码:

#include
#define ll long long
const int maxn=1e5+10;
using namespace std;
int a[maxn],res[maxn],bit[maxn],n;
int main()
{
  int n,x,y;
  int ans=0;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>x>>y;
  }
  printf("%.12lf\n",(double)1/n);
  //system("pause");
  return 0;
}

I. 驾驶卡丁车

思路:

模拟,要记录当前速度和车头方向,模拟过程判断是否撞到墙或者超出地图范围。

代码:

#include
#define ll long long
const int maxn=2e5+10;
using namespace std;
char map1[60][60];
int n,m,x,y,q;
int xx,yy,v=0,dd=0;//v记录速度,dd记录方向
vector>dir;
void x_y(int tu)//判断当前方向
{
  if(tu==-1)//left
  {
    if(dd==0)dd=7;
    else dd--;
  }
  else
  {
    if(dd==7)dd=0;
    else dd++;
  }
}
bool peng()//判断是否碰撞
{
  if(v==0)return false;
  else
  {
    for(int i=1;i<=v;i++)
    {
      if(map1[x+dir[dd].first][y+dir[dd].second]=='#')//上下左右且碰壁
      {
        v=0;
        return true;
      }
      else if(dd%2&&(map1[x+dir[dd].first][y]=='#')&&(map1[x][y+dir[dd].second]=='#'))
      {
        v=0;
        return true;
      }
      else
      {
        x=x+dir[dd].first;
        y=y+dir[dd].second;
        if(x>n||y>m||x<1||y<1)//穿模
        {
          x=x-dir[dd].first;
          y=y-dir[dd].second;
          v=0;
          return true;
        }
      }
    }
    return false;
  }

}
int main()
{
  cin>>n>>m;
  getchar();
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=m;j++)
    {
      scanf("%c",&map1[i][j]);
      if(map1[i][j]=='*')x=i,y=j;
    }
    getchar();
  }
  //cout<<"x:"<>q;
  string s;
  cin>>s;
  for(int i=0;i

K. 音乐游戏

思路:

签到,统计所有“-”。

代码:

#include
#define ll long long
const int maxn=1e5+10;
using namespace std;
int a[maxn],res[maxn],bit[maxn],n;
int main()
{
  int n;
  int ans=0;
  char s[15];
  cin>>n;
  getchar();
  for(int i=1;i<=n;i++)
  {
    // getline(cin,s);
    gets(s);
    //cout<

你可能感兴趣的:(ccpc,codeforces,算法,c++,数据结构)