Day3
T1
是个模拟,阿拉伯数字转罗马数字,最开始发现信息很多毫无头绪,整理了一下把情况化简了。
berry大佬说得很对,应该从“罗马人的角度”想,就是说怎样是最简单自然的方式,就是十进制拆分了。
(为了方便LY的某些人查到我)
代码:
自认为还是挺短的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int num[10]={0,1,11,111,21,2,12,112,1112,31};//反过来
////////////1 5 10 50 100 500 1000
char c[14]={'I','V','X','L','C','D','M','i','v','x','l','c','d','m'};
int st[3][6]={{0,2,4,6,9,11},
{1,3,5,8,10,12},
{2,4,6,9,11,13}},cnt=0,T;
char ans[1000];
int main()
{
scanf("%d",&T);
while(T--)
{
cnt=0;
int x; scanf("%d",&x);
while(x>=1000000)
{
ans[cnt++]=c[13];
x-= 1000000;
}
for(int y=100000,i=5;y>0&&i>=0;y/=10,i--)
{
if(x>=y)
{
int w=x/y;
for(int j=num[w];j;j/=10)
{
int val=j%10; val--;
ans[cnt++]=c[st[val][i]];
}
x=x-y*w;
}
}
for(int i=0;i<cnt;i++)
printf("%c",ans[i]); printf("\n");
}
return 0;
}
T2
其实都能想到大体思路,就看有没有继续想下去。
对于这样看似不可处理的情况(方案数太大了,没法存下来),先不要就此放弃,思考的应是,我们要拿这个做什么,有什么可以代替它用途的方式。
于是,因为k<=1e8,又只需和k比较,那么当方案数大于k时就赋成inf=1e18+1 即可。
T3
很棒的容斥,新技能get。还有个补集转化思想。
由于有严格拓扑关系,所以可以按拓扑序一起处理。
我没有想到的地方是 预处理不需要跑每个数,因为其实只与有多少个1有关。这样就很好求了。
就是: n太大,m比较小 -> 补集转化 ->全集怎么算 ->特殊到一般 ->1的位数相同的相同 ->剩下的容斥->有拓扑关系->(想成一个图上问题)->得解
Day4
T1
DAG! 自己yy出了DAG的情况,苦想环怎么处理想了一个小时,最后决定乱搞。
要学习敢于乱搞的精神。
T2
模拟,主要是倒着想。
T3
好题。但我想了好久没想到,主要是好久都没有做过这类型的题。
把期望分部分求,列出表示的式子,移项,化简,观察他有什么意义。
注意这类题,用未知量表示未知量,再移项,是常见的处理。
还是觉得千万不要轻易放弃思路,有时觉得没法处理,实际上只是因为思维固化了,
最重要的是从题目要求出发,要想想这个量在这个过程中起作用的部分,那么剩下的部分就可以剪掉或优化。
大部分转化都是这么回事。
然后从特殊到一般的思想,其实还是尽量的简化思路。
最后一句话,也没有什么话可说了:
对于今天LY某些人,采用这种极其幼稚的行为,只能说太闲了。