您的位置:首页 > 其它

BestCoder Round #50 (div.2)

2015-08-09 10:18 381 查看
hdu 5364

【题意】:

问题描述
地主小花难得当一回好人,这次她准备给长工们发津贴。有些长工会偷偷地在领完津贴后又排回队伍里去领津贴。不过小花对此表示无所谓,因为她发的是固定数额的津贴。但是如果有人领到的津贴超过其他所有人的总和的话,小花为了显示自己的公正,会去惩罚他。现已知每个来领津贴的人会登记下自己的工号。


输入描述
输入有多组数据,每组第一行为一个n(1 < = n < = 1000),表示有多少津贴被领,第二行n个数字a1,a2...an,表示n个来领津贴的人的工号(0 < = a[i] < 10000)。


输出描述
输出一个数字,表示被惩罚的人的工号。
若没有人需要被惩罚,则输出-1。


输入样例
3
1 1 2
4
2 1 4 3


输出样例
1
-1


Hint
第一个样例中,1号工人拿走的钱超过其他所有人总和,所以输出1。
第二个样例中,没有拿到的钱超过其他所有人的总和,所以输出-1.

【思路】:如果统计每个人的领的次数大于剩下的次数,则输出此人

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000"
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

using namespace std;

#define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))

typedef long long LL;
typedef unsigned long long LLU;
typedef double db;
const int N=1e5+10;
const int inf=0x3f3f3f3f;

int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}};

inline LL read()
{
    int c=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        c=c*10+ch-'0';
        ch=getchar();
    }
    return c*f;
}
int n,a
,x,ok;
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(a,0,sizeof(a));
        ok=-1;
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            a[x]++;
            /// if the number of a[x] bigger than sum-a[x];
            if(a[x]>n-a[x]){
                ok=x;
            }
        }
        printf("%d\n",ok);
    } return 0;
}


hdu 5365

【题意】:

问题描述
小花是一个热爱健身的姑娘,这天她下载了一个跑步软件,这个软件可以记录下小花跑步的轨迹。小花决定去公园跑步。公园里有许许多多的座椅,小花希望在一些座椅休息一下,并且她在两条座椅之间只跑直线。小花是一个完美主义者,她希望自己最后的轨迹是一个正三边形或者正四边形或者正五边形或者正六边形。小花会从某条座椅开始打开跑步软件,并在回到这个座椅后关闭。
请问小花有多少种跑法。注:若两种跑法经过的座椅集合相同则认为是一种跑法。且经过一条座椅时没有必要一定停下来


输入描述
输入有多组数据
每组数据第一行为一个n(1 < = n < = 20)表示座椅数量
接下来n行,每行两个整数xi,yi(0 < = xi,yi < = 8)表示座椅的坐标


输出描述
输出方案数


输入样例
4
0 0
0 1
1 0
1 1


输出样例
1

【思路】:

正解:地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可。假如你不是地球人,那么即使暴力枚举正三边形和稍微不那么暴力地找正五边形和正六边形也是可以通过的(反正找不到)。

感觉此题考智力~~

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000"
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

using namespace std;

#define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))

typedef long long LL;
typedef unsigned long long LLU;
typedef double db;
const int N=1e5+10;
const int inf=0x3f3f3f3f;

int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}};

inline LL read()
{
int c=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
c=c*10+ch-'0';
ch=getchar();
}
return c*f;
}
int num
;
int c
;
int t,n,h,ok,a
;
struct node
{
int x,y;
} zy[100];
int mat[20][20];
int x
,y
;
int sqr(int x){return x*x;}
int dis(int a,int b){return sqr(x[a]-x[b])+sqr(y[a]-y[b]);}
bool ok3(int a,int b,int c){
if (dis(a,b)==dis(a,c)==dis(b,c)) return 1;
return 0;
}
bool ok4(int a,int b,int c,int d){
int p[6];
p[0]=dis(a,b);p[1]=dis(a,c);p[2]=dis(a,d);p[3]=dis(b,c);p[4]=dis(b,d);p[5]=dis(c,d);
sort(p,p+6);
if (p[0]!=p[1]) return 0;
if (p[1]!=p[2]) return 0;
if (p[2]!=p[3]) return 0;
if (p[4]!=p[5]) return 0;
if (p[4]!=2*p[3]) return 0;
return 1;
}
int main(){
while(scanf("%d",&n)!=EOF){
for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
int ans=0;
/// sum of the sjx

/* for (int i=1; i<=n-2; i++)
for (int j=i+1; j<=n-1; j++)
for (int k=j+1; k<=n; k++) ans+=ok3(i,j,k);
*/
/// sum of the sbx
for (int i=1; i<=n-3; i++)
for (int j=i+1; j<=n-2; j++)
for (int k=j+1; k<=n-1; k++)
for (int p=k+1; p<=n; p++) ans+=ok4(i,j,k,p);
printf("%d\n",ans);
} return 0;
}
/*
Sample Input
4 0 0 0 1 1 0 1 1
Sample Output
1
*/


hdu 5366:

【题意】:

问题描述
ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。


输入描述
输入有多组数据,每组数据第一行为一个整数n(1 < = n < = 60)


输出描述
对于每组数据输出一行表示摆放方案数


输入样例
1	
2
3
4
5
6


输出样例
1
2
3
5
8
12

【思路】:

令f[i]为最后一个木人桩摆放在i位置的方案,令s[i]为f[i]的前缀和。很容易就能想到f[i]=s[i-3]+1,s[i]=s[i-1]+f[i],而s
即是所求答案。本题唯一一个值得注意的点就是当n接近60时会爆int。

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000"
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

using namespace std;

#define rep(i,j,k) for(int i=(int)j;i<(int)k;++i)
#define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))

typedef long long LL;
typedef unsigned long long LLU;
typedef double db;
const int N=1e5+10;
const int inf=0x3f3f3f3f;

int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}};

inline LL read()
{
    int c=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        c=c*10+ch-'0';
        ch=getchar();
    }
    return c*f;
}
LL n;
LL dp[100];
int main()
{
    dp[1]=1;dp[2]=2;dp[3]=3;
    for(int i=4; i<=60; ++i) dp[i]=dp[i-1]+dp[i-3]+1;
    while(scanf("%lld",&n)!=EOF){
        printf("%lld\n",dp
);
    } return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: