SRM 524 div2
250pt
一开始还反应不出来。暴力,枚举两个数。
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string.h> #include <cmath> using namespace std; class ShippingCubes { public: int minimalCost(int N) { int mins=2000000000; for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { if(N%(i*j)==0) { int k=N/(i*j); if((i+j+k)<mins) mins=(i+j+k); } } } return mins; } };
500pt
如果是素数的话,只要两次就行了,1,p-1
如果不是素数的话,只要一次就行了,
要注意特判1,2,3.
很多人都漏掉了3这个比较特殊的数
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string.h> #include <cmath> using namespace std; class MagicDiamonds { public: long long minimalTransfer(long long n) { long long t = (int)sqrt((double)n); t = t+1; if(n==1) return 1; if(n==2) return 2; if(n==3) return 3; for(long long i=2;i<=t;i++) { if(n%i==0) return 1; } return 2; } };
1000pt。
赛后才做出来的,参考了一位大牛的代码。首先把可以选的数按一定的顺序进行排列。注意从小到大枚举。
这里有一个比较特殊的条件就是。一个数对N取余只需要扩展一次就行了。因为如果在队列中前面已经有一
个数对N取余相同,那么当前这个数就不需要进队列了,因为前面的那个数必定会比当前的这个数要小。
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <cmath> #include <queue> using namespace std; struct node { string out; int res; }; queue<node>q; int used[10005]; string My_Format(string str) { int num=str.length(); if(num<9) return str; string ans=""; ans+=str[0]; ans+=str[1]; ans+=str[2]; ans+="..."; ans+=str[num-3]; ans+=str[num-2]; ans+=str[num-1]; ans+="("; //ans+=char(num+'0'); string strnum=""; while(num>0) { strnum+=(char)(num%10+'0'); num/=10; } for(int i=strnum.length()-1;i>=0;i--) ans+=strnum[i]; ans+=" "; ans+="digits"; ans+=")"; return ans; } class MultiplesWithLimit { public: string minMultiples(int N, vector<int> b) { vector<int>a; a.clear(); for(int i=0;i<10;i++) { int ok=1; for(int j=0;j<b.size();j++) { if(b[j]==i) { ok=0; break; } } if(ok==1) a.push_back(i); } int num=a.size(); memset(used,0,sizeof(used)); sort(a.begin(),a.end()); while(q.size()>0) q.pop(); node temp,next; for(int i=0;i<num;i++) { if(a[i]==0) continue; temp.out='0'+a[i]; temp.res=a[i]%N; if(temp.res==0) return My_Format(temp.out); if(used[temp.res]==0) q.push(temp); used[temp.res]=1; } while(q.size()>0) { temp = q.front(); q.pop(); if(temp.res==0) return My_Format(temp.out); for(int i=0;i<num;i++) { next.out=temp.out+char(a[i]+'0'); next.res=(temp.res*10+a[i])%N; if(used[next.res]==0) q.push(next); used[next.res]=1; } } return "IMPOSSIBLE"; } };