20200807 贪心;排队接水;[AHOI2018初中组]分组;国王的游戏

游戏网编2023-07-04 11:171550

记录巧妙思维[自己写的太常规了就不放了]

排队接水|来源

有一个巧妙的存数据方式来输出排序之后编号的顺序(针对快排懒得用结构体的同学)
因为n<=1000,所以给每个ti都*1001,在加上当前序号,可以保证排序的时候序号不干扰排序,又可以方便输出序号(只需mod1001输出序号,/1001 输出时间)直达

[AHOI2018初中组]分组|来源

如果右边一列的高度不低于当前列,则连接右边一列最下方的方块。反之,停止画线。
这样,最靠左的一个“峰”相较其右边一列的高度差就不断减小,直到相同。如此反复。记录所画所有线的最短长度,即为答案。直达

国王的游戏|链接

冒泡排序的思想优化排序直达
还没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;
}
//指针

评论区