• C++
  • 章节 5(废稿,不必查看)

  • @ 2025-4-14 20:50:14

T1T1 电影

思路(卡常):用map统计每个电影让多少人很开心,多少人较开心,最后排序即可。(关输入输出流可以直接卡常过)

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct P{
	int love,like,num;
};
const int N=2e5+50;
P a[N];
unordered_map<int,int> mp;
bool cmp(P a,P b){
	if(a.love==b.love) return a.like>b.like;
	return a.love>b.love;
}
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin >> n;
	for(int i=1;i<=n;i++){
		int yy;
		cin >> yy;
		mp[yy]++;
	}
	cin >> m;
	for(int i=1;i<=m;i++){
		a[i].num=i;
	}
	for(int i=1;i<=m;i++){
		int yy;
		cin >> yy;
		a[i].love=mp[yy];
	}for(int i=1;i<=m;i++){
		int yy;
		cin >> yy;
		a[i].like=mp[yy];
	}
	sort(a+1,a+n+1,cmp);
	cout << a[1].num;
}

T2T2 货仓选址

思路:选中间(偶数则看心情选一个),然后绝对值相加。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int a[N];
signed main(){
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	sort(a+1,a+n+1);
	int z=n/2+1,cnt=0;
	for(int i=1;i<=n;i++){
		if(i==z) continue;
		cnt+=abs(a[z]-a[i]);
	}
	cout << cnt;
}

T3T3 七夕祭

思路:横竖均为环形均分纸牌问题,具体分析方法见小蓝书 (《算法竞赛进阶指南》) P37-39页。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+50;
int col[N],row[N];
int b[N];
int n,m,t;
int get(int n,int a[]){
    if(t%n) return 2e9;
    int pj=t/n,ans=0;
    for(int i=2;i<=n;i++){
        b[i]=b[i-1]+a[i]-pj;//换了一种形式写,本质不变
    }
    sort(b+1,b+n+1);
    int mid=(n+1)/2;
    for(int i=1;i<=n;i++) ans+=abs(b[mid]-b[i]);
    return ans;
}
signed main(){
    cin >> n >> m >> t;
    for(int i=1;i<=t;i++){
        int x,y;
        cin >> x >> y;
        row[x]++,col[y]++;
    }
    int a=get(n,row),b=get(m,col);
    if(a!=2e9&&b!=2e9) cout << "both " << a+b;
    else if(a!=2e9) cout << "row " << a;
    else if(b!=2e9) cout << "column " << b;
    else cout << "impossible"; 
}

0 条评论

目前还没有评论...