原题链接:P1011 [NOIP1998 提高组] 车站 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈🏳️🌈
参考文章:题解 P1011 【车站】 - dingcx 的博客 - 洛谷博客 (luogu.com.cn)
#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!