4.1.
折点计数:
思路:极值点左右单调性不一致
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
int n,c,i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
c=0;
for(i=1;i<n-1;i++)
{
if(((a[i]-a[i-1])<0)&&((a[i+1]-a[i])>0)||((a[i]-a[i-1])>0)&&((a[i+1]-a[i])<0))//左右增减不同
c++;
}
cout<<c<<endl;
return 0;
}
9.2
火车购票
思路:先找连续的,再找不连续的位置
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
int b[20][5];
void FindSet(int n)
{
int i,j,t,k;
//找连续的
for(i=0;i<20;i++)
{
k=0;
for(j=0;j<5&&k<n;j++)
{
if(b[i][j]==0) k++;
}
if(k==n)
{
for(t=j-k;t<j;t++)
{
b[i][t]=1;//坐人
cout<<5*i+t+1<<" ";
}
break;
}
}
if(i>=20)//找不连续的
{
k=0;
for(i=0;i<20;i++)
{
for(j=0;j<5&&k<n;j++)
{
if(b[i][j]==0)
{
cout<<5*i+j+1<<" ";
b[i][j]=1;//坐人
k++;
}
}
if(k==n) break;
}
}
cout<<endl;
}
int main()
{
int n,c,i,j,sum;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<20;i++)//座位
{
for(j=0;j<5;j++)
{
b[i][j]=0;
}
}
sum=0;
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum<=100)//可以订票
{
FindSet(a[i]);
}
}
return 0;
}
12.1
思路:排序分奇偶,考虑中间元素在左右的分布是否均匀即可
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
int n,i,c,b,t,flag;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
t=a[n/2];
if(n%2==0) flag=-1;
else flag=0;
c=b=0;
for(i=n/2+flag;i>=0;i--)
{
if(a[i]==t) c++;
else break;
}
for(i=n/2;i<n;i++)
{
if(a[i]==t) b++;
else break;
}
if(c==b)
cout<<t<<endl;
else
cout<<-1<<endl;
return 0;
}
12.2
思路一(只有60分):对税后工资分段,取最后一段换算,求得税前工资
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int S,T,c;
double sum;
cin>>T;
c=T-3500;
if(c<=1500)
{
sum=c/0.97;
S=sum+3500;
}
else if(c<=4500)
{
c-=1455;
sum=c/0.9;
S=sum+3500+1500;
}
else if(c<=9000)
{
c-=4155;
sum=c/0.8;
S=sum+3500+4500;
}
else if(c<=35000)
{
c-=7755;
sum=c/0.75;
S=sum+3500+9000;
}
else if(c<=55000)
{
c-=27255;
sum=c/0.7;
S=sum+3500+35000;
}
else if(c<=80000)
{
c-=41255;
sum=c/0.65;
S=sum+3500+55000;
}
else
{
c-=53505;
sum=c/0.55;
S=sum+3500+80000;
}
cout<<S<<endl;
return 0;
}
思路二(枚举法):用3500~100000间的数一个个试
代码:
#include<iostream>
using namespace std;
int main()
{
int T,S;
cin>>T;
if(T<=3500)
cout<<T<<endl;
else
{
for(int i=3600;i<1000000;i+=100)
{
int S=0;
if(i<=5000)
S=(i-3500)*0.03;
else if(i<=8000)
S=(i-3500-1500)*0.1+45;
else if(i<=12500)
S=(i-3500-4500)*0.2+300+45;
else if(i<=38500)
S=(i-3500-9000)*0.25+900+300+45;
else if(i<=58500)
S=(i-3500-35000)*0.3+6500+900+300+45;
else if(i<=83500)
S=(i-3500-55000)*0.35+6000+6500+900+300+45;
else
S=(i-83500)*0.45+8750+6000+6500+900+300+45;
if((i-S)==T)
{
cout<<i<<endl;
break;
}
}
}
return 0;
}