250:题意:在20以内的串,只有'?','o','x'.'?'可以变为'x'或者'o',变得代价不同,求最小代价变为回文的。
略思,20个长度,不大,暴力就能解决,话说tc250一般都是暴力啊,500是dp的多。
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
class MinCostPalindrome{
public:
int getMinimum(string s, int oCost, int xCost)
{
int i,len,cost;
len=s.size ();
cost=0;
for(i=0;i<len/2;i++)
{
if(s[i]==s[len-i-1]&&s[i]!='?') continue;
if(s[i]=='?'&&s[len-i-1]=='o'||s[i]=='o'&&s[len-i-1]=='?') cost+=oCost;
if(s[i]=='?'&&s[len-i-1]=='x'|| s[i]=='x'&&s[len-i-1]=='?') cost+=xCost;
if(s[i]=='?'&&s[len-i-1]=='?')
{
if(oCost>xCost) cost+=xCost*2;
else cost+=oCost*2;
}
if(s[i]!=s[len-i-1]&&s[i]!='?'&&s[len-i-1]!='?'){cost=-1;break;}//这里做的时候没有加break,结果错了,没人cha,>_<
}
return cost;
}
};
上次526.5的250pt也犯了个这么低级的错误:break没加{}.,实例化调试后才发现。。。囧.....
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
class MagicStonesStore{
public:
string ableToDivide(int n)
{
int i,j;
bool prime[2005];
string str="NO";
for(i = 0; i <= 2000; i++)
prime[i] = true;
prime[0]=prime[1]=false;
for(i = 2; i <= 1000; i++)
if(prime[i])
for(j = 2; i*j <= 2000; j++)
prime[i*j] = false;
for(i=2;i<2*n;i++)
{
if(prime[i]&&prime[2*n-i]) {str="YES"; break;}
}
return str;
}
};
int main()
{
MagicStonesStore m;
int n;
string s;
while(cin>>n)
{
s=m.ableToDivide(n);
cout<<s<<endl;
}
}
500pt: 给出一个vector数组,还有切得刀数。切成10的长度,问最多能切成几段。
开始想设个数组存下处理过的vector,按照被切的优先顺序存放。
结束后看了大牛的代码,发现先处理能被10整除的数,再处理不能被10整除的数。
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
class Cut{
public:
int getMaximum(vector <int> eelLengths, int maxCuts)
{
Int ans=0;
Sort(a.begin(),a.end());
For(int i=0;i<a.size();++i)
If(a[i]%10==0)
{
Int d=(a[i]/10)-1;
If(d<=m) ans+=a[i]/10,m-=d;
Else
Ans+=m,m=0;
}
For(int i=0;i<a.size();++i)
If(a[i]%10!=0)
{
Int d=min(m,(a[i]/10));
Ans+=d,m-=d;
}
Return ans;
}
};
1000 暂时无力- - |||