A题:
很简单的一个题,直接按顺序输出这个字符串0,1,3,6......位置的字符就行了
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;
const int maxn =1e6+5;
const int maxm=10000;
const int mod =10000019;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const int MAXN=1000010;
int main()
{
int n;scanf("%d",&n);
string s; std::cin>>s;
int p=0;
for(int i=0;i<n;i+=p)
{
std::cout<<s[i];
p++;
}
return 0;
}
B题:
输出min(次大值减最小值,最大值减次小值)
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;
const int maxn =1e5+5;
const int maxm=10000;
const int mod =10000019;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const int MAXN=1000010;
int main()
{
int n;scanf("%d",&n);
int a[maxn];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
sort(a,a+n);
printf("%d",min(a[n-2]-a[0],a[n-1]-a[1]));
return 0;
}
C题:
从2的次幂中找出k个,使他们相加等于n。输出一种方案就可以
考虑贪心,从大到小找,满足n - 2的幂 >=k-1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;
const int maxn =1e5+5;
const int maxm=10000;
const int mod =10000019;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const int MAXN=1000010;
int a[40],ans[200100];
int main()
{
int n,k;scanf("%d%d",&n,&k);
a[0]=1;
for(int i=1;i<=30;i++)
{
a[i]=a[i-1]*2;
}
int cnt=0;
for(int i=30;i>=0;i--)
{
while(n-a[i]>=k-1&&n&&k)
{
n=n-a[i];
ans[++cnt]=a[i];
k--;
}
}
if(n==0)
{
cout<<"YES"<<endl;
for(int i=cnt;i>1;i--)
printf("%d ",ans[i]);
printf("%d\n",ans[1]);
}
else cout<<"NO"<<endl;
return 0;
}
D题:
有n个小朋友转圈,每个小朋友只记得自己后面的两个小朋友,让你找出来小朋友排列的正确次序。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;
const int maxn =1e5+5;
const int maxm=10000;
const int mod =10000019;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const int MAXN=1000010;
bool vis[maxn];
int a[maxn],b[maxn];
int i,x;
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
for(i=x=1;i<=n;i++)
{
printf("%d ",x);
vis[x]=true;
int A=a[x],B=b[x];
if(a[A]!=B&&b[A]!=B)
std::swap(A,B);
if(vis[A]) std::swap(A,B);
x=A;
}
return 0;
}