题目:hdu4161-4170
Iterated Difference:
绝对暴力,可是比赛时写出代码,wa了三次,因为中间输出忘了注释,这写代码功底是差到家了,很少能一气呵成,不出错误。还是思路不够清晰明了。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[50];
int b[50];
int main()
{
int n;
int cas=0;
int step;
while(cin>>n&&n)
{
step=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
int flag=0;
sort(b,b+n);
if(b[0]==b[n-1])
{
// cout<<"hehe"<<endl;
flag=1;
step=0;
}
else
{
int t;
for(int j=1;j<=1000;j++)
{
step++;
t=a[0];
for(int i=0;i<n-1;i++)
{
a[i]=abs(a[i]-a[i+1]);
b[i]=a[i];
}
a[n-1]=abs(a[n-1]-t);
b[n-1]=a[n-1];
sort(b,b+n);
if(b[0]==b[n-1])
{
flag=1;
break;
}
}
}
printf("Case %d: ",++cas);
if(flag==0)
printf("not attained\n");
else
printf("%d iterations\n",step);
}
return 0;
}
Stock Prices: 大水题,排序一下就行
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
int a;
int order;
}s[1100000];
bool cmp(node x,node y)
{
if(x.a==y.a)
return x.order<y.order;
else
return x.a<y.a;
}
int b1[110];
int b2[110];
int main()
{
int n,k1,k2,i;
int cas=0;
while(scanf("%d%d%d",&n,&k1,&k2)&&n&&k1&&k2)
{
for(i=1;i<=n;i++)
{
scanf("%d",&s[i].a);
s[i].order=i;
}
sort(s+1,s+1+n,cmp);
printf("Case %d\n",++cas);
for(i=1;i<=k1;i++)
b1[i]=s[i].order;
sort(b1+1,b1+1+k1);
for(i=1;i<=k1;i++)
{
cout<<b1[i];
if(i!=k1)
cout<<" ";
}
cout<<endl;
for(i=n;i>n-k2;i--)
b2[n-i]=s[i].order;
sort(b2,b2+k2);
for(i=k2-1;i>=0;i--)
{
cout<<b2[i];
if(i!=0)
cout<<" ";
}
cout<<endl;
}
return 0;
}
Pills:
题意就是:n个w和n个h组成一个排列,对于任意前i(i>=1&&i<=2*n)个字符,w的个数大于等于h的个数。 裸卡特兰数,之前有做过0,1排列的,还是一下没有反应过来。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
int a;
int order;
}s[1100000];
bool cmp(node x,node y)
{
if(x.a==y.a)
return x.order<y.order;
else
return x.a<y.a;
}
int b1[110];
int b2[110];
int main()
{
int n,k1,k2,i;
int cas=0;
while(scanf("%d%d%d",&n,&k1,&k2)&&n&&k1&&k2)
{
for(i=1;i<=n;i++)
{
scanf("%d",&s[i].a);
s[i].order=i;
}
sort(s+1,s+1+n,cmp);
printf("Case %d\n",++cas);
for(i=1;i<=k1;i++)
b1[i]=s[i].order;
sort(b1+1,b1+1+k1);
for(i=1;i<=k1;i++)
{
cout<<b1[i];
if(i!=k1)
cout<<" ";
}
cout<<endl;
for(i=n;i>n-k2;i--)
b2[n-i]=s[i].order;
sort(b2,b2+k2);
for(i=k2-1;i>=0;i--)
{
cout<<b2[i];
if(i!=0)
cout<<" ";
}
cout<<endl;
}
return 0;
}
User Names:
算是if,else 问题,又是敲完出了好多bug,中间参数竟然传错了,后来输入有问题,原来是样例的问题,每个样例都多了一个空格。经过各路帮助,解决了。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
map<string,int > mp;
char s[1000][100];
string ss[1100];
int main()
{
int cas=0;
int n,k;
while(scanf("%d%d",&n,&k)&&n&&k)
{
mp.clear();
// getchar();
char c;
while((c=getchar())!='\n') ;
for(int i=0;i<n;i++)
{
gets(s[i]);
// cout<<s[i]<<endl;
}
for(int i=0;i<n;i++)
{
ss[i]="";
int len=strlen(s[i]);
int j=0;
while(s[i][j]=='-'||s[i][j]=='\'')
{
j++;
// cout<<"j"<<j<<endl;
}
if(s[i][j]>='A'&&s[i][j]<='Z')
s[i][j]+=32;
ss[i]+=s[i][j];
//cout<<ss[i]<<endl;
for(j=len-1;j>=0;j--)
{
if(s[i][j]==' ')
break;
}
j++;
// cout<<"je j:"<<j<<endl;
int lenth=1;
while(j<len&&lenth<k)
{
if(s[i][j]=='-'||s[i][j]=='\'')
{
j++;
continue;
}
if(s[i][j]>='A'&&s[i][j]<='Z')
s[i][j]+=32;
ss[i]+=s[i][j];
j++;
lenth++;
}
mp[ss[i]]++;
int ret=mp[ss[i]];
if(ret>1)
{
//cout<<i<<"hehe"<<endl;
ret--;
//cout<<"ret"<<ret<<endl;
int ll=ss[i].length();
if(ll<k&&ret<10)
{
ss[i]+=(ret+'0');
}
else if(ll<k-1)
{
if(ret/10!=0)
ss[i]+=(ret/10+'0');
ss[i]+=(ret%10+'0');
}
else
{
if(ll==k&&ret<10)
{
//cout<<"hahha"<<endl;
ss[i][ll-1]=(ret+'0');
// cout<<"11"<<endl;
//cout<<ss[i][ll-1]<<endl;
//cout<<ss[i]<<endl;
}
else if(ll==k&&ret>=10)
{
ss[i][ll-1]=(ret%10+'0');
ss[i][ll-2]=(ret/10+'0');
}
else if(ll==k-1&&ret>=10)
{
ss[i][ll-1]=(ret/10+'0');
ss[i]+=(ret%10+'0');
}
}
}
}
printf("Case %d\n",++cas);
for(int i=0;i<n;i++)
{
cout<<ss[i]<<endl;
}
}
return 0;
}