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层)
思路:其顶点数只能为(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;
}