1.不同的数
这道题暴力就可以了。
#include<iostream>
using namespace std;
int a[155],c[150];
bool b[150];
int main()
{
int n,k;
cin>>n>>k;
int l=0;
int res=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(!b[a[i]])
{
res++;
c[l++]=i+1;
b[a[i]]=true;
}
}
if(res>=k)
{
cout<<"YES"<<endl;
for(int i=0;i<k;i++)cout<<c[i]<<" ";
}else cout<<"NO"<<endl;
return 0;
}
2.看图做题
这道题看图我们就可以找到规律,1的时候是1,2的时候是1+12,3的时候是1+12+24,所以我们可以 猜一下,有没有可能n的时候是(n-1)*12,再加上n之前的,然后代码就很简单啦,然后就去试试啦,果然猜对啦。。。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long res=1;
for(int i=1;i<n;i++)
{
res+=(long long)i*12;
}
cout<<res<<endl;
return 0;
}
3.砍树
这道题和树的重心那道题差不多,题目是要求我们删掉一些边,使剩下的所有连通分量都具有偶数个节点,那么我们可以找一个父节点的子节点,如果这个父节点的子节点是偶数,那么我们就可以删除一条边,这样这个连通分量就是子节点加父节点,就会是偶数,反则就不删除。除此之外,我们还能发现,如果给出的点不是偶数,那么边数就是偶数,那么它就无论怎么删,都没有办法达到要求,所有输出-1.
#include<cstring>
#include<iostream>
using namespace std;
const int N=1e5+10,M=2*N;
int a[N],e[M],ne[M],h[M],idx;
int n;
int ans=0;
void add(int a,int b)
{
e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int dfs(int u,int fa)
{
int s=1;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa)continue;
int sx=dfs(j,u);
if(sx%2==0)ans++;
else s+=sx;
}
return s;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n;
for(int i=0;i<n-1;i++)
{
int x,y;
cin>>x>>y;
add(x,y);add(y,x);
}
if(n%2)cout<<"-1"<<endl;
else
{
dfs(1,-1);
cout<<ans<<endl;
}
return 0;
}