编号(太晚了,先发一题,可能以后题都单发了,方便分类整理)

编号 - NYOJ

/*结构体数组,属性包括顺序,城市,年份,后六位,输入时存下顺序,
然后结构体多关键字排序,
遍历结构体数组,前后年份一致则后六位= cnt++;
不一致则cnt= 1,后六位 = cnt ++; 
最后按照输入顺序排序,再遍历输出

以上为蒟蒻(我的)做法
***********************

进阶流程如下
结构体数组a[N]按照年份从小到大排序
遍历结构体数组,哈希思想:后六位 = hash[a[N].year]++;
简单,细节少
最后同样的输出手法

**********************
套路及使用场景
1、输入顺序储存

const int N = 1e6;
struct city{
    int <数据>,No;
}a[N];
bool cmp(city x,city b){
    return x.No < y.No;
}
for(int i = 1;i <= n;i++){
    cin >> a[i].<数据>
    a[i].No = i;
}
…………
sort(a+1,a + 1 + n,cmp);
for(int i = 1;i <= n;i++){
    cout << a[i].<……>;

}
return 0;


场景是输入的数据明显需要排序求解,但输出要按原顺序
2、哈希表

for(int i = 1;i <= n;i++){
    a[i].<1> =  hash[a[i].<2>]++;
}


关于这个哈希的套路,暂时归结不出什么前提条件,留待与其他哈希题比较
*/

完整ac代码

#include <algorithm>
#include <iostream>
using namespace std;
const int N = 1e6;
struct M{
    int Year,City,No,yz;
}a[N];
bool cmp01(M x,M y){
    return x.Year < y.Year;
}
bool cmp02(M x,M y){
	return x.No < y.No;
}
int cnt[N];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++){
        scanf("%d%d",&a[i].City,&a[i].Year);
        a[i].No = i;
    }
    sort(a+1,a+m+1,cmp01);
    for(int i = 1;i <= m;i++){
        a[i].yz = ++cnt[a[i].City];
    }
    sort(a+1,a+m+1,cmp02);
    for(int i = 1;i <= m;i++){
        printf("%06d%06d\n",a[i].City,a[i].yz);
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值