https://codeforces.com/contest/1095/problem/A
题意:给定一个长度为n的加密过的字符串,找到他的原来的序列,加密的过程就是第一个字符输出一个,第二个字符输出两个,第三个输出三个,依次;
思路:设置一个标志位每次递增,输出相应的字符。
#include<bits/stdc++.h>
int main()
{
int n;
char ch[100];
while(scanf("%d",&n)!=EOF)
{
scanf("%s",&ch);int t=0;
for(int i=1;t<n;i++)
{
printf("%c",ch[t]);
t+=i;
}
printf("\n");
}
return 0;
}
https://codeforces.com/contest/1095/problem/B
题意:给定n个数的序列,任意去掉一个数,在剩余的序列中找到最大值与最小值的差,使之最小
思路:将原序列的最大值,次大值,最小值,次小值分别删除然后再分别计算生于序列的最大值与最小值的差,保留一下最小值
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[100005];
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
printf("%d\n",min(a[n-1]-a[1],a[n]-a[2]));
}
return 0;
}
https://codeforces.com/contest/1095/problem/C
题意:给定两个数n,k,将n用k个2的次数组成,输出这k个数
思路:首先将这k个数全部初始化为1然后再从最高位向最低位不断增加。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
int n,k;
cin>>n>>k;
int a[k];
ll sum=k;
fill(a,a+k,1);
for(int i=k-1;i>=0;i--)
{
while(sum+a[i]<=n)
{
sum+=a[i];
a[i]*=2;
}
}
if(sum!=n)
cout<<"NO\n";
else
{
cout<<"YES\n";
for(int i=0;i<k;++i)
{
cout<<a[i]<<' ';
}
}
return 0;
}