#16099: 測資問題


hshua (hshua)

學校 : 新北市立林口高級中學
編號 : 52506
來源 : [163.20.185.250]
最後登入時間 :
2024-03-15 09:17:14
c634. 基礎排序 #2-1 ( 質因數和 ez) -- it's david | From: [125.227.237.177] | 發表日期 : 2018-11-21 08:55

#0: 100% WA (line:79)
您的答案為: 86wcAy54izXCTU 正確答案為: 8Ei654qNsWYEqP

//------------------------------------
實際測試
86wcAy54izXCTU   N=8654   S=4329
8Ei654qNsWYEqP   N=8654   S=4329
前後排序應該沒錯吧!

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define maxn 10000
struct PART{
string S;
int N,Nsum;
};
vector<PART> V;
vector<int> prime;
bool v[maxn+5];
//-----------------------------------------
int Prime(int x){
int sum=0, k=0, p;
while(k<=maxn && x>1){
if(x%prime[k]==0) {
if(prime[k]!=p) sum += prime[k];
p=prime[k];
x /= prime[k];
}
else k++;
}
if(x>1 && x!=p) sum += x;
return sum;
}
//-----------------------------------------
bool comp1(PART a, PART b){
if(a.Nsum>b.Nsum) return true;
else if(a.Nsum==b.Nsum && a.S<b.S) return true;
else if(a.Nsum==b.Nsum && a.S==b.S && a.N>b.N) return true;
else return false;
}
//=========================================
int main() {
char tmp[200];
int n,ns;
memset(v,0,sizeof(v));
for(int i=2; i<maxn; i++){
if(v[i]==0){
v[i]=1;
prime.push_back(i);
int j=i+i;
while(j<maxn) { v[j]=1; j+=i; }
}
}

while(scanf("%s",tmp)!=-1){
int x=0, ps;
for(int i=0; i<strlen(tmp); i++){
if(tmp[i]>='0' && tmp[i]<='9')
x = x*10 + (tmp[i]-'0');
}
ps=Prime(x);

//printf("@@@ %s %d %d\n",tmp,x,ps);
V.push_back({tmp,x,ps});
}

sort(V.begin(), V.end(), comp1);
for(int i=0; i<V.size(); i++) cout<<V[i].S<<"\n";
}

 

 
#16100: Re:測資問題


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [1.168.27.116]
最後登入時間 :
2024-03-31 17:58:15
c634. 基礎排序 #2-1 ( 質因數和 ez) -- it's david | From: [36.233.35.38] | 發表日期 : 2018-11-21 09:20

 

text 遞增

 
#16109: Re:測資問題


hshua (hshua)

學校 : 新北市立林口高級中學
編號 : 52506
來源 : [163.20.185.250]
最後登入時間 :
2024-03-15 09:17:14
c634. 基礎排序 #2-1 ( 質因數和 ez) -- it's david | From: [220.133.124.236] | 發表日期 : 2018-11-21 21:08

 

text 遞增

還是過不了!

#0: 100% WA (line:319)

您的答案為: m37yvd0ORRXl2o
正確答案為: dNlP6743HujSnV

--------------------------------------------

實際的測試結果是: (應該沒錯啊)

dNlP6743HujSnV

 

m37yvd0ORRXl2o

--------------------------------------------------------------------

#include <iostream>

#include <algorithm>

#include <cstring>

#include <vector>

using namespace std;

#define maxn 10000

struct PART{

    string S,Sx;

    int N,Nsum;

};

vector<PART> V;

vector<int> prime;

bool v[maxn+5];

//-----------------------------------------

int Prime(int x){

    int sum=0, k=0, p;

    while(k<=maxn && x>1){

        if(x%prime[k]==0) {

            if(prime[k]!=p) sum += prime[k];

            p=prime[k];

            x /= prime[k];

        }

        else k++;

    }

    if(x>1 && x!=p) sum += x;

    return sum;

}

//-----------------------------------------

bool comp1(PART a, PART b){

    if(a.Nsum>b.Nsum) return true;

    else if(a.Nsum==b.Nsum && a.Sx<b.Sx) return true;

    else if(a.Nsum==b.Nsum && a.S==b.S && a.N>b.N) return true;

    else return false;

}

//=========================================

int main() {

char tmp[200];

int n,ns;    

    memset(v,0,sizeof(v));

    for(int i=2; i<maxn; i++){//建立質數表

        if(v[i]==0){

            v[i]=1;

            prime.push_back(i);

            int j=i+i;

            while(j<maxn) { v[j]=1; j+=i; }

        }

    }

 

while(scanf("%s",tmp)!=-1){ 

    char ss[1000];

    int x=0, ps, k=0;

    for(int i=0; i<strlen(tmp); i++){

        if(tmp[i]>='0' && tmp[i]<='9')

            x = x*10 + (tmp[i]-'0');

        else 

            ss[k++] = tmp[i];

    }

    ss[k] = '\0';

    ps=Prime(x);

//printf("%s  %s  %d  %d\n",tmp,ss,x,ps); 

        V.push_back({tmp,ss,x,ps});

}

 

sort(V.begin(), V.end(), comp1);

for(int i=0; i<V.size(); i++) cout<<V[i].S<<"\n";

 

}

 

 
ZeroJudge Forum