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";
	  }
};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2011-11-19 00:28  lwbaptx  阅读(345)  评论(0编辑  收藏  举报

导航