题目链接
ABCD1水题。
哎,两个小时就除了这四个题,出题太慢了......
D2:
题意:给你n个数,每次可以选任意一个数,让它除以等于2(向下取整),可以操作任意多次,问最少操作多少次能使这n个数中有k个相等的数。
思路:用vector存一下就行了。做题的时候光想dp了,实际上不是dp,就是个思维题。
#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout< v[maxn];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(k==1)
{printf("0\n");return 0;}
for(int i=1;i<=n;i++)
{
int p=a[i],cnt=0;
while(p>=0)
{
v[p].push_back(cnt);
if(p==0)
break;
p/=2;
cnt++;
}
}
int ans=inf,anss;
for(int i=0;i=k)
{
sort(v[i].begin(),v[i].end());
anss=0;
for(int j=0;j
E:
题意:给你一个整数n,再给你两个长度均为2的字符串(均有abc三个字符构成),问:能否找到一个长度为3n的字符串满足abc三个字符的数目均为n,并且上面两个字符串都不是这个字符串的子串,输出这个字符串,如果不存在这样的字符串输出NO。
思路:实际上这题答案一定存在,做的时候我也猜到了,就是不知道答案那个字符串是啥。
就是这个答案可以由简单的字符变换出来,比如:abc可以变换成aabbcc,aaabbbccc,或者abcabc,abcabcabc,就这两个情况,对abc搞个全排列,然后把这两种变换都是一下,一定能找到结果。
具体=可以看这篇博客:https://www.cnblogs.com/wawcac-blog/p/11464774.html
#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<
G:
题意:一个有向图,每条边都有一个权值,有m个询问,每个询问找出有多少对点使得这些点对之间的最大边权不大于q。
思路:
把询问离线,对于每个询问,我们把比他的要求小的边全部加进树中。
那么答案就是所有连通块的贡献,每个连通块的贡献是sz*(sz-1)/2
那么我们按询问的要求值从小到大排序,然后每次尝试加边,并用并查集维护连通块大小
参考博客:https://blog.csdn.net/liufengwei1/article/details/100168298
#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<