在lookfor函数那里产生了误解,怎么判断是不是最后一个不变的数组。利用flag的真假比较高效! 另:有没有大佬们有递归算法的ac?希望可以发一下!么么哒~ 附上C代码:
int s[1111];
int Lookfor(int *p,int n) { int i, j; int flag=0; int cnt; for(i=0;i<n;i++) { cnt=0; for(j=i+1;jp[j]) cnt++; } if(p[i]!=cnt) { p[i]=cnt; flag=1; } } return flag; }
void solve() { int n; scanf(“%d”,&n); int i, j, k; int tmp=0; for(i=0;i<n;i++) { scanf(“%d”,&s[i]); } while(Lookfor(s,n)); for(i=0;i<n-1;i++) printf(“%d “,s[i]); printf(“%d\n”,s[i]); }
int main() { int i, t; scanf(“%d”,&t); getchar(); for(i=0;i<t;i++) { printf(“case #%d:\n”,i); solve(); } return 0; }
我的想法是当不变的数量不等于总数居量的时候一直进行操作(循环)出循环的条件是数据不变的数量等于总数据量
int main() { //输入格式 //第 1 行:一个整数 T(1≤T≤10) 为问题数。 int T = 0; scanf(“%d”, &T); for (int i = 0; i < T; i++) { //对于每组测试数据: //第 1 行是一个正整数:数列长度 N(2 \lt N \leqslant 30);大于等于\geqslant和小于等于\leqslant int N=0; scanf(“%d”, &N); int a[30] = { 0 }; int count = 0;//a[n]=cnt[n]的个数 //第 2 行有 N 个正整数: //分别为该数列第 1 至第 N 个元素的值 a1, a2, ⋯, an(a1, a2, ⋯, an均为 1 - 1000 的数) //每两个整数之间用一个空格分开。 for (int j = 0; j < N; j++) { scanf(“%d “, &a[j]); }
//从第一个元素开始,依次把数列中的每个数替换为它右边比它小的数的个数。 //对该数列不断进行这个操作。 //总有一个时刻该数列将不再发生改变(即此时每个数都恰好等于它右边比它小的数的个数) while (count != N) { count = 0; for (int j = 0; j < N; j++) { int cnt = 0; for (int k = j + 1; k < N; k++) { if (a[j] > a[k]) { cnt++; } } if (a[j] == cnt) { count++; } a[j] = cnt; } } //输出格式 //对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。 printf("case #%d:\n",i); //然后在一行中依次输出最后数列的所有元素,每两个元素之间用一个空格分开, for (int j = 0; j < N; j++) { printf("%d ", a[j]); } printf("\n"); //最后一个元素后面没有空格。 }
}
#include <iostream> using namespace std; bool arraySame(const int *a, const int *b, int len) { for (int i = 0; i < len; i++) if (a[i] != b[i]) return false; return true; } void arrayCopy(int *a, const int *b, int len) { for (int i = 0; i < len; i++) a[i] = b[i]; } int main() { int t; cin >> t; for (int z = 0; z < t; z++) { int n; cin >> n; int arr[30] = { 0 }; for (int i = 0; i < n; i++) cin >> arr[i]; int tmp[30] = { 0 }; do { arrayCopy(tmp, arr, n); for (int i = 0; i < n - 1; i++) { int cnt = 0; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[i]) cnt++; } arr[i] = cnt; } arr[n - 1] = 0; } while (arraySame(arr, tmp, n) == false); cout << "case #" << z << ":" << endl; for (int i = 0; i < n; i++) cout << arr[i] << ' '; cout.put('\n'); } return 0; }
在lookfor函数那里产生了误解,怎么判断是不是最后一个不变的数组。利用flag的真假比较高效!
另:有没有大佬们有递归算法的ac?希望可以发一下!么么哒~
附上C代码:
include
include
include
include
include
int s[1111];
int Lookfor(int *p,int n)
{
int i, j;
int flag=0;
int cnt;
for(i=0;i<n;i++)
{
cnt=0;
for(j=i+1;jp[j])
cnt++;
}
if(p[i]!=cnt)
{
p[i]=cnt;
flag=1;
}
}
return flag;
}
void solve()
{
int n;
scanf(“%d”,&n);
int i, j, k;
int tmp=0;
for(i=0;i<n;i++)
{
scanf(“%d”,&s[i]);
}
while(Lookfor(s,n));
for(i=0;i<n-1;i++)
printf(“%d “,s[i]);
printf(“%d\n”,s[i]);
}
int main()
{
int i, t;
scanf(“%d”,&t);
getchar();
for(i=0;i<t;i++)
{
printf(“case #%d:\n”,i);
solve();
}
return 0;
}
我的想法是当不变的数量不等于总数居量的时候一直进行操作(循环)出循环的条件是数据不变的数量等于总数据量
include
int main()
{
//输入格式
//第 1 行:一个整数 T(1≤T≤10) 为问题数。
int T = 0;
scanf(“%d”, &T);
for (int i = 0; i < T; i++) {
//对于每组测试数据:
//第 1 行是一个正整数:数列长度 N(2 \lt N \leqslant 30);大于等于\geqslant和小于等于\leqslant
int N=0;
scanf(“%d”, &N);
int a[30] = { 0 };
int count = 0;//a[n]=cnt[n]的个数
//第 2 行有 N 个正整数:
//分别为该数列第 1 至第 N 个元素的值 a1, a2, ⋯, an(a1, a2, ⋯, an均为 1 - 1000 的数)
//每两个整数之间用一个空格分开。
for (int j = 0; j < N; j++) {
scanf(“%d “, &a[j]);
}
}
第一次用do while语句