Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope

题意:给你一些钉子的高度以及一端连接钉子一段链接物体的绳子,问至少剪短多少绳子使物体触碰地面

思路:只需要切钉子高度大于绳子长度的绳子。

当时写的麻烦了

#include 
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define ULL unsigned long long
#define pb push_back
typedef pair PII;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
const int N = 3e6 + 100, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7,P=133331;
int n;
struct node
{
	int h,rope,low;
}a[N];
bool cmp(node a,node b)
{
	return a.low>b.low;
}
void solve()
{
  int ans=0;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
	cin>>a[i].h>>a[i].rope;
	a[i].low=a[i].h-a[i].rope;
  }
  sort(a+1,a+1+n,cmp);
  for(int i=1;i<=n;i++)
  {
	if(a[i].low<=0)
	break;
	ans++;
  }
  cout<> T;
	while (T--)solve();
	return 0;
}
 

B. Rudolph and Tic-Tac-Toe

题意:X,+,O能以三个出现在一行,一列,对角线,就输出相应字符,否则输出'DRAW'。

思路:就模拟就行了

写的太臃肿了。。。

可以看一下官方题解Codeforces round 883 Editorial - Codeforces

#include 
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define ULL unsigned long long
#define pb push_back
typedef pair PII;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
const int N = 3e6 + 100, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7,P=133331;
char g[5][5];
bool check(string s)
{
    if(s=="XXX"||s=="+++"||s=="OOO")
	return true;
	return false;
}
void solve()
{
	bool flag=0;
   int n=3;
   for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
   cin>>g[i][j];
   string s[10];
   s[0]+=g[1][1],s[0]+=g[1][2],s[0]+=g[1][3];
   s[1]+=g[2][1],s[1]+=g[2][2],s[1]+=g[2][3];
   s[2]+=g[3][1],s[2]+=g[3][2],s[2]+=g[3][3];
   s[3]+=g[1][1],s[3]+=g[2][1],s[3]+=g[3][1];
   s[4]+=g[1][2],s[4]+=g[2][2],s[4]+=g[3][2];
   s[5]+=g[1][3],s[5]+=g[2][3],s[5]+=g[3][3];
   s[6]+=g[1][1],s[6]+=g[2][2],s[6]+=g[3][3];
   s[7]+=g[1][3],s[7]+=g[2][2],s[7]+=g[3][1];
   for(int i=0;i<8;i++)
   {
	if(check(s[i]))
	{
		cout<> T;
	while (T--)solve();
	return 0;
}
 

C. Rudolf and the Another Competition

题意:给出每个人做的题的所花时间,求Rudolf(第一个人)能排在第几名,排序规则,以过题数为第一顺序,罚时为第二顺序。如果题数和罚时相同,Rudolf最优。

思路:我们贪心的想就是先安时间排序一下,加算两个前缀和,分别是过题用时,过题罚时

然后按排序要求排序即可

#include 
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define ULL unsigned long long
#define pb push_back
typedef pair PII;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
const int N = 3e5 + 100, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7,P=133331;
int n,m,h;
struct node
{
	int score,punish,id;
}a[N];
vectorg[N];
vectorp[N];
bool cmp(node a,node b)
{
	if(a.score!=b.score)
	return a.score>b.score;
	if(a.punish!=b.punish)
	return a.punish>n>>m>>h;
	for(int i=1;i<=n;i++)
	{
		g[i].clear();
		p[i].clear();
		g[i].pb(0);
		p[i].pb(0);
	}
 	for(int i=1;i<=n;i++)
 	{
		for(int j=1;j<=m;j++)
		{
			int x;
			cin>>x;
		  g[i].pb(x);
		  p[i].pb(x);
		}
		sort(g[i].begin(),g[i].end());
		sort(p[i].begin(),p[i].end());
	}
	for(int i=1;i<=n;i++){
	  for(int j=1;jh)
			{
				flag=1;
				a[i].score=j-1;
				a[i].punish=p[i][j-1];
				break;
			}
		}
		if(!flag)
		{
		a[i].score=m;
		a[i].punish=p[i][m];
		}
	}
   sort(a+1,a+1+n,cmp);
   for(int i=1;i<=n;i++)
   {
	if(a[i].id==1)
	{
		cout<> T;
	while (T--)solve();
	return 0;
}
 

D. Rudolph and Christmas Tree

题意:给你三角形的高与宽,以及三角形在数轴上的高度,求其面积;

思路:记录每个三角形的上下界,按下界由小到大排序,如果当前上界与上面一个的下届无冲突加上一个完整三角形,否则利用三角形相似求上底,然后加上一个梯形面积

我写的时候用set去了一下重

#include 
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define ULL unsigned long long
#define pb push_back
typedef pair PII;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
const int N = 3e5 + 100, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7,P=133331;
int n,d,h;
int yy[N];
struct node
{
	int up,down;
}a[N];
bool cmp(node a,node b)
{
	return a.downs;
	cin>>n>>d>>h;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		s.insert(x);
	}
	for(auto ed:s)
	{
        idx++;
		a[idx].down=ed;
		a[idx].up=ed+h;
	}
	sort(a+1,a+1+idx,cmp);
	a[idx+1].down=1e12;
	for(int i=1;i<=idx;i++)
	{
		if(a[i].up<=a[i+1].down)
		ans+=1.000*(d*h)/2;
		else 
		{
			int hh=h-(a[i+1].down-a[i].down);
		    double tt=1.0*d*(1.0*hh/h);
            ans+=1.0*(d+tt)*(a[i+1].down-a[i].down)/2;
		}
	}
	printf("%.10lf\n",ans);
} 
signed main()
{
	Ysanqian;
	int T;
	//T=1;
	cin >> T;
	while (T--)solve();
	return 0;
}

E1. Rudolf and Snowflakes (simple version)

题意:首先一个点,先扩展k条边,之后每个点都连k条边一直扩展下去,给我们一个n,问能否制作n个点的图形。(然后题目还说其实是看图,发现除中间点之外,最少2层)

思路:其顶点数只能为1+k1+k2+k3+...+kp(p>=2,最少2层吗)

所以我们先预处理k为1~1000的数据,因为 n≤10e6.

然后输入判断存在是否

需要注意的是有的雪花,2层就大于1e6了,特判一下就可以了

#include 
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define ULL unsigned long long
#define pb push_back
typedef pair PII;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
const int N = 3e5 + 100, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7,P=133331;
sets;
int n;
void init()
{
   for(int k=2;k<=1000;k++)
   {
	 int res = 1 + k + k * k;
    if (res <= 1e6) s.insert(res);
	int cnt=3;
	while(res<=1e6)
	{
		res+=pow(k,cnt);
		s.insert(res);
		cnt++;
	}
   }
}
void solve()
{  
	cin>>n;
	if(s.count(n))cout<<"YES"<> T;
	while (T--)solve();
	return 0;
}

你可能感兴趣的:(codeforces,c++)