Inversion
http://acm.hdu.edu.cn/showproblem.php?pid=6098
用二维数组存a中的数和下标,从大到小排个序,然后枚举判下表是否为i的倍数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int cmp(const void *a,const void *b)
{
int *c = (int *)a;
int *d = (int *)b;
return *d - *c;
}
ll a[100000][2];
int main()
{
ll b[100000];
int n,i,t,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
a[0][0]=0;
a[0][1]=0;
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i][0]);
a[i][1]=i;
}
qsort(a,n+1,sizeof(a[0]),cmp);
for(i=2;i<=n;i++)
{
for(j=0;j<n;j++)
{
if(a[j][1]>=i)
{
if((a[j][1]%i)!=0)
{
b[i-2]=a[j][0];
break;
}
}
else if(a[j][1]<i)
{
b[i-2]=a[j][0];
break;
}
}
}
for(i=0;i<n-1;i++)
{
printf("%I64d",b[i]);
if(i!=n-2)
printf(" ");
}
printf("\n");
}
return 0;
}
Classes
http://acm.hdu.edu.cn/showproblem.php?pid=6106
简单题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int max1=0;
while(n--)
{
int a,b,c,ab,bc,ac,abc;
scanf("%d%d%d%d%d%d%d",&a,&b,&c,&ab,&bc,&ac,&abc);
ab=ab-abc;//只报ab课的人数
bc=bc-abc;//只报bc课的人数
ac=ac-abc;//只报ac课的人数
a=a-ab-ac-abc;//只报a课的人数
b=b-ab-bc-abc;//只报b课的人数
c=c-ac-bc-abc;//只报c课的人数
if(a<0||b<0||c<0||ab<0||bc<0||ac<0||abc<0)//判断数据是否有错
{
continue;
}
int s=0;
s=a+b+c+ab+bc+ac+abc;
max1=max(max1,s);
}
printf("%d\n",max1);
}
return 0;
}