[AHOI2018初中组]分组|来源有一个巧妙的存数据方式来输出排序之后编号的顺序(针对快排懒得用结构体的同学)
因为n<=1000,所以给每个ti都*1001,在加上当前序号,可以保证排序的时候序号不干扰排序,又可以方便输出序号(只需mod1001输出序号,/1001 输出时间)直达
国王的游戏|链接如果右边一列的高度不低于当前列,则连接右边一列最下方的方块。反之,停止画线。
这样,最靠左的一个“峰”相较其右边一列的高度差就不断减小,直到相同。如此反复。记录所画所有线的最短长度,即为答案。直达
用冒泡排序的思想优化排序直达
还没AC呢,等会看看哪错了
谁能想到是进位不够呢
其他看了的东西也一起记录一下叭不然就像啥也没学一样
- Markdown入门教程
这个感觉不是很全,但是基本的语法差不多都有
- Git/Github入门
- 直接用命令行
- 可视化界面
其实熟悉了命令行也用不上可视化外包了
// main.cpp // Water containing // // Created by Leonardo Cullen on 2017/5/6. // Copyright © 2017年 Leonardo Cullen. All rights reserved. // #include <iostream> #include <cstdio> #include <algorithm> using namespace std; double sum; long int n; long long int t[1001]; double ans; int main(int argc, const char * argv[]) { cin>>n; int x; for(int i=1;i<=n;i++) { cin>>x; t[i]=x*1001+i; } sort(t+1,t+1+n); for(int j=1;j<=n;j++) { cout<<t[j]%1001<<" "; sum+=t[j]/1001*(n-j); } cout<<endl; ans=sum/n; printf("%0.2lf",ans); return 0; }
#include<cstdio> #include<map> std::map<int,int>m; typedef std::map<int,int>::iterator it; int main(){ int n,ans=0x3f3f3f3f; scanf("%d",&n); for(int i=0;i<n;++i){ int t; scanf("%d",&t); ++m[t]; //记录图像。 } while(!m.empty()){ it i=m.begin(),j=m.begin(); --(*i).second; int t=1; for(++j;j!=m.end()&&(*j).first==(*i).first+1&&(*j).second>(*i).second;++i,++j){ ++t; --(*j).second; } //若 i,j 所对应的能力值是连续的,且 i 对应的那一列高度不高于 j,则继续画线。 i=m.begin(); while(i!=m.end()&&(*i).second==0){ m.erase((*i++).first); } //高度降为 0 后直接删除,便于计算。 if(t<ans){ ans=t; } //记录答案。 } printf("%d",ans); return 0; }
#include <bits/stdc++.h> #define RG register int #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll long long #define inf (1<<29) #define make_pair mp const int maxn=1e4+5; using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } struct node{ int left,right; }a[maxn]; int cmp(node a,node b){ return a.right*a.left<b.right*b.left; } int maxs[maxn]={0},last[maxn];//前一位的乘积,从1开始算 int laaa_len=1,maaa_len=1;//前一位的位数 void ppl(int n){ int num=a[n-1].left,pp[maxn];//当前可获金币数量 memset(pp,0,sizeof(pp)); laaa_len+=10;//最多乘10^4,多加一位//实际上这里要多加,至于为什么,咱也不知道 rep(i,1,laaa_len) { pp[i]+=last[i]*num; pp[i+1]+=pp[i]/10; pp[i]%=10; // cout<<pp[i]<<" "<<pp[i+1]<<endl; } while(!pp[laaa_len])laaa_len--;//获取当前位数 memcpy(last,pp,sizeof(pp));//获取当前乘积 // per(i,laaa_len,1)cout<<pp[i]; // cout<<endl; // num=a[n].right; per(i,laaa_len,1) { pp[i-1]+=pp[i]%num*10; pp[i]/=num; } while(!pp[laaa_len])laaa_len--; // cout<<"num: "<<num<<' '<<endl; // per(i,laaa_len,1)cout<<pp[i]; // cout<<endl; // per(i,laaa_len+2,1) { if(pp[i]==maxs[i]){continue;} else if(pp[i]>maxs[i]){memcpy(maxs,pp,sizeof(pp));maaa_len=laaa_len;break;} else break; } } int main() { int n=read();n+=1; rep(i,1,n){ a[i].left=read();a[i].right=read(); } sort(a+2,a+n+1,cmp); memset(last,0,sizeof(last));last[1]=1; rep(i,2,n)ppl(i); per(i,maaa_len,1)cout<<maxs[i]; return 0; } //指针
评论列表