【洛谷】独自一人听歌写题

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 【洛谷】独自一人听歌写题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

🎆音乐分享 

星辰大海 – 黄霄雲
 


【洛谷】独自一人听歌写题
 

原题链接: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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!