I have written the following program for PERMUT2- ambiguous permutations
And I simply don’t understand why this code says wrong output on CodeChef, but runs fine on my PC…
#include
#include <malloc.h>
#include <stdio.h>
using namespace std;
int main() {
long int t, n;
int *permut, *inverse;
int ambFlag=1;
//cin>>t;
while (scanf("%d", &n) && n) {
//cin>>n;
//if (n==0) break;
permut=new int[n];
inverse=new int[n];
for (long int i=0; i<n; i++) {
cin>>permut[i];
if (n==1) {
ambFlag=1;
}
else {
inverse[permut[i]-1]=i+1;
}
}
if (n!=1) {
for (long int i=0; i<n; i++) {
if (permut[i]!=inverse[i]) {
ambFlag=0;
break;
}
}
}
if (ambFlag==0) cout<<"not ambiguous"<<endl;
else cout<<"ambiguous"<<endl;
delete [] permut;
delete [] inverse;
}
return 0;
}
#include
#include <malloc.h>
#include <stdio.h>
using namespace std;
int main() {
long int t, n;
int *permut, *inverse;
int ambFlag=1;
//cin>>t;
while (scanf("%d", &n) && n) {
//cin>>n;
//if (n==0) break;
ambFlag = 1;
permut=new int[n];
inverse=new int[n];
for (long int i=0; i<n; i++) {
cin>>permut[i];
if (n==1) {
ambFlag=1;
}
else {
inverse[permut[i]-1]=i+1;
}
}
if (n!=1) {
for (long int i=0; i<n; i++) {
if (permut[i]!=inverse[i]) {
ambFlag=0;
break;
}
}
}
if (ambFlag==0) cout<<"not ambiguous"<<endl;
else cout<<"ambiguous"<<endl;
delete [] permut;
delete [] inverse;
}
return 0;
}
you are not resetting ambFlag=1;
every test case…
once it become zero it wont serve any purpose
so add ambFlag = 1 as the first statement in the loop
#include<stdio.h>
#include<stdlib.h>
short int dec[1000]={0};
int main()
{int n,j=0;
scanf("%d",&n);
while(1)
{if(n==0)break;
short int src=NULL;
src=(short int)malloc(n*sizeof(short int));
int i;
for(i=0;i<n;i++)
{scanf("%hd",(src+i));
}
for(i=0;i<n;i++)
{
if(src[src[i]-1]!=i+1)
break;
}
if(i==n) dec[j++]=1;
else dec[j++]=2;
scanf("%d",&n);
free(src);
}
j=0;
while(dec[j]!=0)
{if(dec[j++]==1)
printf(“ambiguous\n”);else printf(“not ambiguous\n”);}
return 0;
}
I am getting SIGSEGV on this code.
Please help i am unable to figure it out.
http://ww2.codechef.com/viewsolution/2146773
I am getting SIGSEGV on this code.
Please help.
I fixed several problems in your solution, and it’s ok now - http://ww2.codechef.com/viewsolution/2148208
Please help me too. The following code has been judged wrong although it outputs the exact inverse permutation. I posted a comment below that question and a user answered saying that the second half of my “decide” method is wrong but I couldn’t figure that out. Please help.
http://www.codechef.com/viewsolution/3914108
Once observe this part :
for (i = 0; i < len; i++)
{
if (newseq[i] != seq[i])
return 1;
else
return 0;
}
every time you are checking only the first terms i.e you are returning 1
if (newseq[0] != seq[0])
and 0 for
(newseq[0] == seq[0]).
Here is the mistake. i.e you need to check all the terms and then return 0 if all terms are equal but not only the first term. If you have any doubt try this case:
6
1 3 5 6 2 4
correct answer is not ambiguous
but your answer is ambiguous
Oh I understood that now. I wanted it to output as soon as a discrepancy between the given permutation and the inverse one is found. So now I have used a counter j, but it is still judged as a wrong answer.
http://www.codechef.com/viewsolution/3929621
it should not be j==len-1
but j==len
i.e
if (j == len)
return 0;
or simply
return 0;
http://www.codechef.com/viewsolution/3929637
// factorial
#include
using namespace std;
int main()
{
long double t, n;
cin >> t;
for (int i=0; i<t; i++)
{
long int c=0;
cin >> n;
for (int j=1; int(n/(5^j))>0; j++)
c = c + int(n/(5^j));
cout << c << endl;
}
return 0;
}
for this code codechef shows wrong answer
include
using namespace std;
int main()
{
int t,n;
cin >> t;
while(t–)
{
cin >> n;
int count=0;
for(int j=5;(int)(n/j)>=1;j*=5)
{
count=count+(int)(n/j);
}
cout << count << “\n”;
}
return 0;
}
and for this it is accepted although both of them are giving same output.
Plz someone rectify the mistake in first code snippet
Thank you so much. This question had been bothering me for last 3 days.