思路:
就是把n个人分到k个组 尽量平均分配 然后计算 我是根据公示计算的
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define INF 0x7fffffff
#define MEM(a,x) memset(a,x,sizeof a)
//#define ll __int64
using namespace std;
int a[10010];
int main()
{
//freopen("ceshi.txt","r",stdin);
int tc;
scanf("%d",&tc);
while(tc--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
{
a[i]=n/k;
}
int b=n%k;
int cnt=0;
while(b)
{
a[cnt++]++;
b--;
}
// cout<<"cnt "<<cnt<<endl;
int sum=0;
if(cnt==0)
{
sum=a[0]*a[0]*(k*(k-1)/2);
printf("%d\n",sum);
continue;
}
if(cnt==1)
{
sum+=a[0]*a[1]*(k-1);
// sum+=a[0]*a[k-1]*cnt*(k-cnt);
sum+=a[1]*a[1]*((k-1)*(k-2)/2);
printf("%d\n",sum);
continue;
}
if(cnt>1&&cnt<(k-1))
{
sum+=a[0]*a[0]*(cnt*(cnt-1)/2);
sum+=a[0]*a[k-1]*cnt*(k-cnt);
sum+=a[k-1]*a[k-1]*((k-cnt)*(k-cnt-1)/2);
printf("%d\n",sum);
continue;
}
if(cnt==(k-1))
{
sum+=a[0]*a[0]*(cnt*(cnt-1)/2);
sum+=a[0]*a[k-1]*(k-1);
printf("%d\n",sum);
continue;
}
}
return 0;
}
首先选择手机牌子买的个数最多的 假如有好几个一样的 再选择价格最低的
同一个牌子的手机 可能会出现不同的价格 也选择价格最低的
map的简单应用
之前使用getline 不对
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <map>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define INF 0x7fffffff
#define MEM(a,x) memset(a,x,sizeof a)
//#define ll __int64
using namespace std;
map<string,int> m1;//记录手机的数量
map<string,int> m2;//记录手机价格
int main()
{
//freopen("ceshi.txt","r",stdin);
string s1,s2;
int c;
string s[10];
for(int i=0;i<6;i++)
{
// getline(cin,s1);
// getline(cin,s2);
cin>>s1; cin>>s2;
scanf("%d",&c);
// getchar();
m1[s2]++;
if(m1[s2]>1)
{
if(m2[s2]>c)
m2[s2]=c;
}
else m2[s2]=c;
s[i]=s2;
}
int num=-1;
int pr=(int)1e6;
string ans;
for(int i=0;i<6;i++)
{
if(num<m1[s[i]])
{
num=m1[s[i]];
pr=m2[s[i]];
ans=s[i];
}
else
{
if(num==m1[s[i]]&&pr>m2[s[i]])
{
pr=m2[s[i]];
ans=s[i];
}
}
}
cout<<ans<<endl;
return 0;
}