https://vjudge.net/contest/170300#problem/G
这个地方学的是 便输入边处理,,
而且题意自己没看懂
https://vjudge.net/contest/170300#problem/F
这个地方的思路很好,, 就是每个层级的长度减去。。
http://codeforces.com/contest/831/problem/C
这个地方原来只需要sort一下之后就很好解决了。不过要注意用 set是为了去重
http://codeforces.com/contest/831/problem/B
看到别人的这个的代码挺好的
char tr[500];
int main(){
string s1,s2,s3;
for(int i=0;i<=300;++i)tr[i]=i;
cin>>s1>>s2>>s3;
for(int i=0;i<=25;++i)tr[s1[i]]=s2[i],tr[s1[i]-32]=s2[i]-32;
rep(i,0,s3.length()){
cout<<tr[s3[i]];
}puts("");
}
https://vjudge.net/contest/170300#problem/I
挺好的题目,题解说是dfs ,看了挺久,大概懂了意思。。//其实这里deep应该是个数的意思把。。。
int st[maxn];
int cnt=0;
bool dfs(int n,int start,int deep){
if(n<0)return 0;
if(deep==0){
if(n==0){
pf("%d\n",cnt);
rep(i,1,cnt){
pf("%d%c",st[i],i==cnt?'\n':' ');
}
return 1;
}
return 0;
}
for(int i=start;i>=1;i--){
if(i*i*i*deep<n)break;
st[++cnt]=i;
if(dfs(n-i*i*i,i,deep-1))return 1;
--cnt;
}
return 0;
}
int main(){
int n;
while(~sf("%d",&n)){
cnt=0;
for(int i=1;i<=n;++i){
if(dfs(n,365,i))break;
}
}
}
个人感觉另一种写法更好看。。
int a[1000];
int tmp[1000];
int ans=0;
void dfs(int now,int n,int mx){
if(n==0){
if(now<ans){
ans=now;
for(int i=0;i<ans;++i){
a[i]=tmp[i];
}
}
}
if(now+1>=ans)return;//说这个简直很减去时间
for(int i=mx;i>=1;i--){
if(i*i*i>n)continue;
if(now+n/(i*i*i)>=ans)return;
tmp[now]=i;
dfs(now+1,n-i*i*i,i);
if(n==i*i*i)return;
}
}
int main(){
int n;
while(~sf("%d",&n)){
ans=inf;
dfs(0,n,365);
pf("%d\n",ans);
rep(i,0,ans-1)pf("%d ",a[i]);
puts("");
}
}