简单总结一下,虽说是test,但是难度比较适中,没有特别难的。
A求与算术平均值一样的数的下标
B数学题,画出一棵类似二叉树的东西就可以发现是求gcd的递归的深度,当其中一个数为1时就应该返回深度,注意有公共因子的数都不行,自己画一棵树理解一下
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define pii pair<int ,int>
#define mp make_pair
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 1000005
int gcd(int x,int y,int dep){
if(y == 1) return dep + x / y - 1;
if(y == 0) return MAX;
return gcd(y , x % y, dep + x / y);
}
int main(){
int n,ans = MAX;
cin>>n;
if(n == 1) ans = 0;
for(int i = n - 1; i > 0; --i)
{
int t = gcd(n,i,0);
if(ans > t) ans = t;
}
printf("%d\n",ans);
return 0;
}
C贪心。策略是每次从大到小取出,减1,如果存在当前需要交换的数大于比它的小的数的个数时就无解(额,有点绕口,本人文采不好),用优先队列实现最好。具体看代码
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define pii pair<int ,int>
#define mp make_pair
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 300005
struct node {
int num;
int id;
node (int x,int y) {
num = x;
id = y;
}
bool operator < (node const &a) const{
if (num != a.num)
return num < a.num;
return id < a.id;
}
};
priority_queue<node> p;
int xx[N],yy[N];
int tmp[N];
int d[N];
int main(){FRE;
int n,m;
cin>>n>>m;
int i,j;
for (i = 1; i <= n;i++) {
int a;
cin>>a;
p.push(node(a,i));
d[i] = a;
}
bool ok = 1;
int cnt = 0;
while (!p.empty()) {
node t = p.top();
p.pop();
if (t.num > p.size()) {
ok = 0;
break;
} else {
int cc = 0;
for (i = 0; i < t.num; i++) {
tmp[cc++] = p.top().id;
p.pop();
}
for (i = 0; i < cc; i++) {
d[tmp[i]]--;
xx[cnt] = t.id;
yy[cnt++] = tmp[i];
if (d[tmp[i]]) {
p.push(node(d[tmp[i]],tmp[i]));
}
}
}
}
if (!ok) {
printf("No\n");
} else {
printf("Yes\n");
printf("%d\n",cnt);
for (i = 0 ; i < cnt; i++) {
cout<<xx[i]<<" "<<yy[i]<<endl;
}
}
return 0;
}