A爱心买气球
博弈论
枚举最简单的情况0 1|1 1|1 2进行判断! 加加减减找到一般规律了立即猜一下结论去证明
不要在非一般性数据|结论里面找规律 特别是不要枚举大数据找规律! 大道至简
B 亚托利-我挚爱的时光
1.读取带有空格的字符串:
cin.ignore();👍
getline(cin,x);//连读则while(n--)
2.存末尾的字符串:逆读
string p=x;
reverse(p.begin(),p.end());👍
int t=0;
string ss;
while(p[t]!=' ') {
ss+=p[t];
t++; //这个一定不能忘!👍
}
3.map
map<string,int> 可以存对于许多字符串而言,每个字符串当前状态是什么!
//记住写代码要往尽量简洁写!
D01分数规划
全部是相连的 即全部将?化为0 或者全部化为1 直接判断输出即可!
GKruskal
最小生成树:包含n个点和n-1条权值最小的边的图!不是一个点和很多个点相连的树,随便哪条边,只要将n个点串起来即可
对于本题,总是可以找到一个点和此点相与为0,除了本点的值为全1时不能!连上他就行
I双指针
公式化简!
遇到公式,毫不犹豫化简,化成一边或者有相同的下标||同样的形式下标不同||适时可以试着代一些特殊值
#define int long long
map<double,int> vp; //存某个值有几个
vp[1.0*a[i]/b[i]]++;//直接对于这个数++即可! 直接1.0
if(vp.count(t)) //map内置函数!
ans+=vp[t];//成立条件:a1/b1=b2/a2; 所以最后才会除
if(a[i]==b[i])
ans--; //由于他自己还会和自己配对!所以要减掉一个!
//会加两遍,所以输出就是/2
cout<<ans/2<<endl;
J树上DP
该树所有子树的结点的权值和的总和:某层的结点权值*层数加起来就是ans
注意循环语句while {j++} 控制边界值!