可是我为什么要专门开一发写这个呢......
1.1 思维的体操
例题1 The Dragon of Loowater
贪心
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int x[20005],y[20005];
int main()
{
while(~scanf("%d %d",&n,&m)&&(n||m))
{
for(int i=0;i<n;i++) scanf("%d",&x[i]);
for(int i=0;i<m;i++) scanf("%d",&y[i]);
sort(x,x+n);
sort(y,y+m);
int k=0;
int num=0;
for(int i=0;i<m;i++)
{
if(x[k]<=y[i])
{
num+=y[i];
k++;
if(k==n) break;
}
}
if(k<n) printf("Loowater is doomed!\n");
else printf("%d\n",num);
}
return 0;
}
例题2 Commando War
贪心
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,cnt;
struct Node{int a,b;}node[MAXN];
inline bool cmp(struct Node x,struct Node y){return x.b>y.b;}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].a,&node[i].b);
sort(&node[1],&node[n+1],cmp);
long long ans=0,sum=0;
for(int i=1;i<=n;i++)
{
sum+=node[i].a;
ans=max(ans,sum+node[i].b);
}
cnt++;
printf("Case %d: %lld\n",cnt,ans);
}
return 0;
}
例题3 Spreading the Wealth(中位数,贪心)
题目模型:给定数轴上的n个点,在数轴上的所有点中,中位数离所有的顶点距离之和最小。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
using namespace std;
int n;
long long a[MAXN],c[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
long long tot=0;
for(int i=1;i<=n;i++) tot+=a[i];
long long M=tot/n;
c[0]=0;
for(int i=1;i<n;i++) c[i]=c[i-1]+a[i]-M;
sort(&c[0],&c[n]);
long long cur=c[n/2];
long long ans=0;
for(int i=0;i<n;i++) ans+=abs(cur-c[i]);
printf("%lld\n",ans);
}
return 0;
}
例题4 Graveyard
例题5 Piotr's Ants
例题6 Image Is Everything
例题7 Even Parity
例题8 Colored Cubes
例题9 Chinese Mahjong
例题10 Help is needed for Dexter
给定正整数n,你的任务是用最少的操作次数把序列1,2,3...,n中的所有数都变成0,每次操作可以从序列中选择一个或者多个证书,同时减去一个相同的正整数。
f(n)=f(n/2)+1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n;
inline int solve(int x)
{
if(x==1) return 1;
else return solve(x/2)+1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
printf("%d\n",solve(n));
return 0;
}
例题11 A Different Task
例题12 Assemble
例题13 Pie
例题14 Fill the Square
例题15 Network
例题16 Beijing Guards
例题17 Age sort
桶排
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 110
using namespace std;
int n;
int cnt[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(cnt,0,sizeof(cnt));
int cur;
for(int i=1;i<=n;i++) scanf("%d",&cur),cnt[cur]++;
bool flag=false;
for(int i=1;i<=100;i++)
{
if(cnt[i]==0) continue;
for(int j=1;j<=cnt[i];j++)
{
if(flag==true) printf(" ");
printf("%d",i);
flag=true;
}
}
printf("\n");
}
return 0;
}