前言
大家好啊,这里是幸麟
一名普通的大学牲,最近在学算法,希望这篇题解对你有帮助
codeforce id:XingRin
本文栏目:一起来打cf吧
比赛时间好晚,打完状态真的很差
第一次打div3难度的,比div2简单多了
还是比较适合像我这样的萌新的
本篇所有题目难度预计在div2的A~B题间
全部是思维题,不涉及算法,请各位放心食用
目录
A. Polycarp and the Day of Pi
B. Taisia and Dice
C. Premutation
D. Matryoshkas
E. Vlad and a Pair of Numbers
题目链接:Problem - A - Codeforces
大意:
今天是圆周率之日,Polycarp同学想知道自己写的圆周率哪里不对,他会输入一个数(小数点去除,并且最多30位),希望你告诉他,他写对了前几位
例如315,他只写对前两位数字(真正的应该是314)
比较简单,只要一一对比每一个数字就可以了
#include
#include
using namespace std;
string s="314159265358979323846264338327";
int main()
{
int t;
cin>>t;
string s1;
while(t--)
{
cin>>s1;
int num=0;
for(int i=0;i
题目链接:Problem - B - Codeforces
题目:
题目大意:Taisia有n个骰子,这个骰子有6面,每一次投掷可能有6种点数(1,2,3,4,5,6),其实就是正常的骰子
有一次在抛完后,Taisia统计了n个骰子的点数之和s,统计完后他家的猫把点数最大的那颗骰子拿走了,于是他又统计了剩下n-1个骰子的点数r,
他将这些数据告诉你,希望你可以输出符合条件的n个骰子的点数,如果有多种,输出一种就可以了
例如
n=2,s=2,r=1
那么两个骰子可能的点数就是 1 1
将其输出便可
只要输出一种可能的情况,我比较喜欢优先输出大的点数
我们目前r点剩余点数,我们将其分配给n-1个骰子便可
具体可以看一下注释
#include
#include
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,s,r;
cin>>n>>s>>r;
int a=s-r;
cout<=a && r-a>=n-2)//剩余点数>想分配的点数
{
cout<
链接:Problem - C - Codeforces
题目:大晚上看的让人眼花缭乱,但是其实还是比较简单的
大意:
有一个序列,其中包含了n个元素,1~n在其中都有(例如 4 2 1 3)
Kristina同学将其写在白板上,但是他的写法比较特别,他会写n行
每一行跳过一个对应的数字,写n-1个数字
例如 4 2 1 3中
第一行写下的是:2 1 3,跳过第一个数字4
第二行:4 1 3
接下来两行也按该规律
他将他在白板上的内容打乱了行序给你,希望你可以还原出原先的序列,并将其输出
思路
’其实蛮简单的,我们只需要找到原先序列的首元素,然后将其与每行的首元素对比,如果发现不同,那么这不同的一行就对应这原先2~n位置的元素,将原先序列的首元素和这一行输出即可
#include
#include
using namespace std;
int a[10010][110];
int main()
{
int t;
cin>>t;
while(t--)
{
int ans[110]={0};
int n;
cin>>n;
for(int i=0;i
这是昨天写的最后一道题目,写到这题已经第二天了,有点写不动了,如果换个时间可能会好些
链接:Problem - D - Codeforces
题目:
样例
大意:开头介绍了一下套娃,大的套娃可以将小的套娃套进去,但是有要求这个被套进去的套娃,必须只比那个大的套娃小一个尺寸,这边用数字代表尺寸
例如4 3 2 1,这四个套娃可以被套在一起
而4 2 1,只有2 1 可以套一起
给你n个套娃,希望你将其套完后场上的套娃数量最少,输出这个最小的数量
如2 2 3 4 3 1
套完后场上最少的套娃数量是2(因为1 2 3 4可以套成一个,2 3可以套成一个)
思路:
我们可以先将套娃整理一下,按尺寸大小排好
假设我们正在套娃中,那我们可以先把套娃分为2种情况,还在套的娃和已经确定不能再套的娃
如何确定不能再套的娃,有以下这些情况
①我们找不到比手中还在套的娃大一个尺寸的套娃了,那么手中还在套的娃便已经不能在套了
例如1 2 4, 我们在套1 2后,发现没有3了,那么1 2就不能继续套了
②小1尺寸的套娃数量多于较大的套娃
比如1 ,1,1,2,2,3, 其中1的数量>2的数量,那么此时多出的1就不能继续套娃了
③我们已经将所有娃都套好,那么原先还在套的娃此时就是不能再套的娃了
最后输出不能再套的娃的数量就好了
#include
#include
#include
using namespace std;
const int N=2e5+10;
int s[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i
今天早上补的题目,感觉比前一题简单,当然可能是状态好些的原因
链接:Problem - E - Codeforces
题目:
大意:
Vlad发现了两个正数a,b,其中a xor b=x x=(a+b)/2
Vlad只记住了x的值,他将这个值告诉你,希望你可以找到a,b两数
有多种情况输出一种即可,没有输出-1
思路:考的是位运算的知识
如果x的二进制是1010
那么根据xor的规则,我们可以先草率的认为
a=1?1?
b=0?0?问号部分进行xor后结果是0,那么a,b对应位的?所代表的值是相同的
那么接下来我们只需要判断每位问号之后是1还是0即可
注意a+b=2x即可
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int x;
scanf("%d", &x);
int x1 = x;
int flag = 1;
int a = 0, b = 0;
int bit = 1, i = 0;
while (bit <= x)
{
bit *= 2;
i++;
}
i--;
for (i; i >= 0; i--)
{
if ((x >> i & 1) == 0)
{
int p = pow(2, i);
if (2 * p <= x1)
{
x1 -= 2 * p;
a += p;
b += p;
if (x1 == 0)
{
break;
}
}
}
}
if (x1)
{
printf("-1\n");
}
else
{
printf("%d %d\n", a + x, b);
}
}
return 0;
}
泪目啊,我刚刚快写完的草稿就这么没了
我又得重新写一遍了,
我应该记得保存的
太难受了
当你看到这个的时候,说明博主已经写两遍差不多的内容了
(咨询博主心理状态。。。。。)
(疯狂暗示,几乎明示)
好了,谢谢你的观看,题解的话写起来还是蛮累的
最近快开学了,事情也多,题解短时间不会再更新了