2 solutions

  • 1
    @ 2025-5-21 19:37:33
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int n,m;
    const int N=1010;
    int cnt[N];
    vector<int> cs[N];
    LL cal(int aim)
    {
    	int cur_cnt=cnt[1];//初始数量
    	vector<int> tmp;
    	LL res=0;
    	for(int i=2;i<=n;i++)
    	{
    		int buy=max(int(cs[i].size()-(aim-1)),0);	//需要改变的数量 
    		for(int j=0;j<buy;j++) //当前这一类价格低的数量 
    		{
    			res+=cs[i][j];
    		}
    		cur_cnt+=buy; //多的肯定都是改到第一种武器 
    		for(int j=buy;j<cs[i].size();j++)
    		{
    			tmp.push_back(cs[i][j]);
    		}
    	} 
    	sort(tmp.begin(),tmp.end()); //在武器[1]的数量为aim的情况下,多出来的武器 
    	for(int i=0;i<aim-cur_cnt;i++) //计算还差的武器[1]的强化材料的数量 
    	{
    		res+=tmp[i];
    	}
    	return res;
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int p,c;
    		cin>>p>>c;
    		cnt[p]++;
    		cs[p].push_back(c);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		sort(cs[i].begin(),cs[i].end());
    	}
    	LL ans=1e18;
    	for(int i=max(cnt[1],1);i<=m;i++) //第一种武器的强化材料的数量 
    	{
    		ans=min(ans,cal(i));
    	}
    	cout<<ans;
    	return 0;
     } 
    
    • 0
      @ 2025-12-4 16:23:23
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1010;
      int a[N],b[N];
      int main()
      {
      	int n,m;
      	cin>>n>>m;
      	if(n==2)
      	{
      		int cnt1=0,cnt2=0;
      		vector<int> v;
      		for(int i=1;i<=m;i++)
      		{
      			int x,y;
      			cin>>x>>y;
      			if(x==1) cnt1++;
      			else
      			{
      				cnt2++;
      				v.push_back(y);
      			}
      		}
      		int cost=0;
      		int i=0;
      		sort(v.begin(),v.end());
      		while(cnt1<=cnt2)
      		{
      			cost+=v[i];
      			i++;
      			cnt1++,cnt2--;
      		}
      		cout<<cost;
      	}
      	if(m==2)
      	{
      		int ans=2e9+10;
      		for(int i=1;i<=2;i++) cin>>a[i]>>b[i];
      		for(int w1=1;w1<=n;w1++)
      		{
      			for(int w2=1;w2<=n;w2++)
      			{
      				vector<int> cnt(n+1,0);//全部清0
      				cnt[w1]++,cnt[w2]++;
      				bool st=true;//最开始是合法的
      				for(int i=2;i<=n;i++)
      				{
      					if(cnt[1]<=cnt[i])
      					{
      						st=false;//说明不合法
      						break;
      					}
      				}
      				if(st)
      				{
      					int cost=0;
      					if(w1!=a[1]) cost+=b[1];
      					if(w2!=a[2]) cost+=b[2];
      					ans=min(ans,cost);
      				}
      			}
      		}
      		cout<<ans;
      	}
      	return 0;
      }
      
      • 1

      Information

      ID
      2218
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      7
      Tags
      # Submissions
      7
      Accepted
      3
      Uploaded By