P1067多项式输出

小细节很多。

#include<iostream>
using namespace std;

int main()
{
	int n,x;
	cin>>n;
	cin>>x;
	if(x)
	{
		if(x!=1&&x!=-1)cout<<x;
		if(x==-1)cout<<"-";
		if((x==1||x==-1)&&n==0)cout<<1;
		if(n&&n!=1)cout<<"x^"<<n;
		else if(n==1)cout<<"x";
	}
	while(n--)
	{
		cin>>x;
		if(!x)continue;
		if(x>0)cout<<"+";
		if(x!=1&&x!=-1)cout<<x;
		if(x==-1)cout<<"-";
		if((x==1||x==-1)&&n==0)cout<<1;
		if(n&&n!=1)cout<<"x^"<<n;
		else if(n==1)cout<<"x";
	}
	
	return 0;
} 

 P1056 排座椅

记录某一行或列放的话能隔开多少人。

#include<iostream>
#include<algorithm>
using namespace std;

int m,n,k,l,d;
int x1,y1,x2,y2;
int row[1005],col[1005];
int idx[1005];

bool cmp1(int a,int b){return row[a]>row[b];}
bool cmp2(int a,int b){return col[a]>col[b];}

int main()
{
    
	cin>>m>>n>>k>>l>>d;
	while(d--)
	{
		cin>>x1>>y1>>x2>>y2;
		if(x1==x2)col[min(y1,y2)]++;
		else row[min(x1,x2)]++;
	}
	for(int i=0;i<1005;i++)idx[i]=i;
	sort(idx,idx+1005,cmp1);
	sort(idx,idx+k);
	for(int i=0;i<k;i++)cout<<idx[i]<<" ";
	cout<<"\n";
	sort(idx,idx+1005,cmp2);
	sort(idx,idx+l);
	for(int i=0;i<l;i++)cout<<idx[i]<<" ";
	cout<<"\n";
	return 0;
} 

P1023 税收与补贴问题

题意很不好理解。意思是政府计算确定收税或补贴的金额使得商家按政府预期价格销售时利润最大,收税或补贴金额是对于每一个商家所定价格而言的,而非只针对预期价格。按照样例,有:

(31-28+x)*110>=(28-28+x)*130

(31-28+x)*110>=(29-28+x)*125

(31-28+x)*110>=(30-28+x)*120

.......

(31-28+x)*110>=(32-28+x)*95

......

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int gov,cost,sale[100005],minn=-(1<<30),maxn=(1<<30);

int main()
{
	int money,num,add;
	int pos=0;
	scanf("%d",&gov);
	while(scanf("%d%d",&money,&num)&&money!=-1)
	{
		if(!pos)
		{
			cost=money;
			sale[pos++]=num;
		}
		else
		{
			add=(num-sale[pos-1])/(money-cost-(pos-1));
			int cnt=money-cost-(pos-1);
			for(int i=0;i<cnt;i++)
			{
				sale[pos]=add+sale[pos-1];
				pos++;
			}
		}
	}
	scanf("%d",&add);
	add*=-1;       
	while(sale[pos-1]+add>0)
	{
		sale[pos]=sale[pos-1]+add;
		pos++;
	}
	gov-=cost;
	int n=pos;             
	for(int i=1;i<n;i++)
	{
		if(sale[i]>sale[gov])
		{
			maxn=min(maxn,(int)floor((double)(gov*sale[gov]-i*sale[i])/(sale[i]-sale[gov])));
		}
		else if(sale[i]<sale[gov])
		{
			minn=max(minn,(int)ceil((double)(i*sale[i]-gov*sale[gov])/(sale[gov]-sale[i])));
		}
	}    
	if(minn>maxn)printf("NO SOLUTION\n");
	else
	{
		if(maxn<0||minn>0)printf("%d\n",maxn<0?maxn:minn);
		else printf("%d\n",abs(maxn)<abs(minn)?maxn:minn); 
	}
	return 0;
}

P1031 均分纸牌

 

自己的弱智模拟思路:先算出每个位置最终的数量avg,从左往右考虑,如果当前位置数量大于avg,则把多余的部分往右移;等于avg不管;小于avg的话,需要右边的某个位置往左分,再往右多了少了,都可以叠加,直到可以有一个位置可以完全满足左边所有的不足为止,移位量就是从第一个不足的到右边满足的位置的位移量。

#include<iostream>
using namespace std;

int n,a[105];

int main()
{
	int n;
	
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int sum=0,avg;
	for(int i=1;i<=n;i++)sum+=a[i];
	avg=sum/n;

	int pos=1,ans=0;
	while(pos<n)
	{   
		if(a[pos]>avg){a[pos+1]+=a[pos]-avg;ans++;}
		else if(a[pos]<avg)
		{
			int num=0,i;
			for(i=pos;i==pos||num<0;i++)
			{
				num+=a[i]-avg;
			}
			a[i-1]=num+avg;
			ans+=i-1-pos;   
			pos=i-2;
		}
		pos++;
	}
	cout<<ans<<endl;
	return 0;
}

然后翻了题解,发现很简单,但也不容易想象,思路是:左边不是avg的话,就向右边借或给右边,移位+1,可以有负数,比如1,2,27->10,-7,27->10,10,10.结合上面的模拟,也可以勉强理解。这才是贪心。。

#include<iostream>
#include<algorithm>
using namespace std;

int n,a[105];

int main()
{	
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int ans=0,sum=0,avg;
	for(int i=1;i<=n;i++)sum+=a[i];
	avg=sum/n;
	for(int i=1;i<n;i++)
	{
		if(a[i]!=avg)
		{
			a[i+1]+=a[i]-avg;
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

P1042乒乓球

注意题目11:11是不能算一局完成的,必须继续直到分差大于等于2才算完成,比如14:12。

还有若恰好比完最后一局,还要输出0:0,很不明白,看的题解。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int score1,score2;
char s[70000];
int len;

int main()
{
	//freopen("input.in","r",stdin);
	while(scanf("%s",s+len)&&strchr(s+len,'E')==NULL)
	{
		len+=strlen(s+len);
	}
	len+=strchr(s+len,'E')-(s+len);  
	if(len==0)cout<<"0:0\n";
	for(int pos=0;pos<len;pos++)
	{
		if(s[pos]=='W')score1++;
		else score2++;
		if(score1>=11&&score1-score2>=2 || score2>=11&&score2-score1>=2 || pos==len-1)
		{
			cout<<score1<<":"<<score2<<"\n";
			if((score1>=11&&score1-score2>=2 || score2>=11&&score2-score1>=2 )&& pos==len-1)cout<<0<<":"<<0<<"\n";
			score1=score2=0;
		}
	}
	cout<<"\n";
	if(len==0)cout<<"0:0\n";
	for(int pos=0;pos<len;pos++)
	{
		if(s[pos]=='W')score1++;
		else score2++;
		if(score1>=21&&score1-score2>=2 || score2>=21&&score2-score1>=2 || pos==len-1)
		{
			cout<<score1<<":"<<score2<<"\n";
			if((score1>=21&&score1-score2>=2 || score2>=21&&score2-score1>=2 )&& pos==len-1)cout<<0<<":"<<0<<"\n";
			score1=score2=0;
		}
	}
	return 0;
} 

 P1086 花生采摘

注意题目说没有两株植株下的花生一样多,没注意这个的话,就复杂很多了。

#include<iostream>
#include<algorithm>
using namespace std;

int m,n,k,map[20][20],idx[400],ans;

bool cmp(int a,int b)
{
	return map[a/n][a%n]>map[b/n][b%n];
}

int main()
{
	cin>>m>>n>>k;
	for(int i=0;i<m;i++)for(int j=0;j<n;j++)cin>>map[i][j];
	for(int i=0;i<m*n;i++)idx[i]=i;
	sort(idx,idx+m*n,cmp);
	    
	int t=0;
	k-=2;
	if(idx[0]/n+1+idx[0]/n>k)ans=0;
	else
	{
		int pos=0;
		t+=idx[pos]/n+1;  
		ans+=map[idx[pos]/n][idx[pos]%n];       
		while(pos+1<m*n && t+abs(idx[pos+1]/n-idx[pos]/n)+abs(idx[pos+1]%n-idx[pos]%n)+1+idx[pos+1]/n<=k)
		{             
			t+=abs(idx[pos+1]/n-idx[pos]/n)+abs(idx[pos+1]%n-idx[pos]%n)+1;
			pos++;
			ans+=map[idx[pos]/n][idx[pos]%n];
		}
	}
	cout<<ans<<endl;
	return 0;
}

P1098 字符串的展开

小细节也比较多

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;

int p1,p2,p3;
char s[105];

int main()
{

	scanf("%d%d%d",&p1,&p2,&p3);
	scanf("%s",s);
	int len=strlen(s);
	for(int i=0;i<len;i++)
	{
		if(s[i]!='-')putchar(s[i]);
		else
		{
			if((isdigit(s[i-1])&&isdigit(s[i+1]) || islower(s[i-1])&&islower(s[i+1]))&&s[i+1]>s[i-1])
			{
				if(p3==1)
				{
					for(int ch=s[i-1]+1;ch<s[i+1];ch++)
					{
						for(int j=0;j<p2;j++)
						{
							if(p1==1)putchar(ch);
							else if(p1==2)putchar(isdigit(ch)?ch:toupper(ch));
							else putchar('*');
						}
					}
				}
				else
				{
					for(int ch=s[i+1]-1;ch>s[i-1];ch--)
					{
						for(int j=0;j<p2;j++)
						{
							if(p1==1)putchar(ch);
							else if(p1==2)putchar(isdigit(ch)?ch:toupper(ch));
							else putchar('*');
						}
					}
				}
			}
			else putchar(s[i]);
		}
	}
	putchar('\n');
	return 0;
}