🎆音乐分享
原题链接:P1011 [NOIP1998 提高组] 车站 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈
参考文章:题解 P1011 【车站】 – dingcx 的博客 – 洛谷博客 (luogu.com.cn)
显然前两行都与前面的数有关,就猜测第三行也与前面的数有关,于是得到第四行。很明显可以发现第四行a的系数比第三行多1,b的系数比第三行少1。
所以不用管前两行,把第三行直接列出来就行了。
//sum1表示a的系数,sum2表示b的系数
sum1[i]=sum1[i-1]+sum1[i-2]-1;//前两个的和-1
sum2[i]=sum2[i-1]+sum2[i-2]+1;//前两个的和+1
#include<cstdio>
using namespace std;
int sum1[25],sum2[25];//a和b的系数
int main(){
int a,n,m,x;
scanf("%d%d%d%d",&a,&n,&m,&x);
sum1[2]=1,sum1[3]=2;//初始化
for(int i=4;i<n;i++){//遍历(必须从4开始,前面没有规律)
sum1[i]=sum1[i-1]+sum1[i-2]-1;//计算系数,见上
sum2[i]=sum2[i-1]+sum2[i-2]+1;
}
int b=(m-a*sum1[n-1])/sum2[n-1];//公式
printf("%d",a*sum1[x]+b*sum2[x]);
return 0;//华丽结束
}
P1068 [NOIP2009 普及组] 分数线划定 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
使用sort排序
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
typedef pair<int,int>PII;
PII a[N];
bool cmp(PII x,PII y)
{
if(x.second>y.second) return 1;
//这一步特别妙
//控制排序时,成绩相同时学号靠前的排在前面
if(x.second==y.second&&x.first<y.first) return 1;
return 0;
}
int main()
{
int n,m,num=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i].first>>a[i].second;//学号 分数
}
sort(a,a+n,cmp);
int t=m*1.5;//人数
int pass=a[t-1].second;//分数线
for(int i=0;i<n;i++)
{
if(a[i].second>=pass) num++;
}
cout<<pass<<' '<<num<<endl;
for(int i=0;i<num;i++)
{
cout<<a[i].first<<' '<<a[i].second<<endl;
}
return 0;
}
不使用排序
使用枚举
#include<cstdio>
using namespace std;
int s[105],k[10005][105];
int main()
{
int n,m,ss,kk,count=0,i,max=0,x,j;
scanf("%d%d",&n,&m);
m=m*1.5;//人数计算
for(i=0;i<n;i++)
{
scanf("%d%d",&kk,&ss);
k[kk][ss]++;//计入
s[ss]++;//计入
}
for(i=100;count<m;i--)
count+=s[i];//算出分数线和能进的人数
printf("%d %d\n",i+1,count);
x=i+1;//记录分数线
for(i=100;i>=x;i--)//分数线内从大到小枚举
for(j=1000;j<=10000;j++)
if(k[j][i]) printf("%d %d\n",j,i);
return 0;
}
Code over!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131377.html