您的位置:首页 > 运维架构

ACM ICPC 2017 Warmup Contest 2(ACM Northeastern European Regional Contest,Northern Subregion 2016)

2017-10-08 23:32 591 查看
第二场,并没有延续第一场的良好状态,然而a作为一道计算几何水题上,却一直卡,还没来得及补,找时间一定要好好看看

此外f和k也没有很轻松,按道理三题难度应该差不多,然而a还是被精度卡了,看看吧

好了,最终得知,其实a不是被卡精度了,而是题目出了点问题,spj被oj吞了,其实这题的做法是没什么问题的,这种天灾人祸的问题,算了,不管了,把另两题补上吧

 K. King's Heir

思路:这题就是个简单的数据结构题,创建新数据类型,然后排序,将国王处理后加入一起排序,找到第一个比国王大的就好了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 110;

typedef struct KING
{
int id;
int day;
int month;
int year;
}King;

bool cmp(const King &a, const King &b)
{
if(a.year > b.year)
{
return true;
}
else if(a.year == b.year)
{
if(a.month > b.month)
{
return true;
}
else if(a.month == b.month)
{
if(a.day > b.day)
{
return true;
}
else if(a.day == b.day)
{
if(a.id < b.id)
{

c7d6
return true;
}
}
}
}
return false;
}

King k[maxn];

int main()
{
while(scanf("%d%d%d",&k[0].day,&k[0].month,&k[0].year)!=EOF)
{
k[0].id = 0;
k[0].year -= 18;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&k[i].day,&k[i].month,&k[i].year);
k[i].id = i;
}
sort(k,k+n+1,cmp);
int person;
for(person=0;person<=n;person++)
{
if(k[person].id==0)
{
break;
}
}
if(person == n)
{
printf("-1\n");
}
else
{
printf("%d\n",k[person+1].id);
}
}
return 0;
}


 F. Folding

思路:这题不难发现是个幂次处理问题,每个2的幂次作为一个分界点

关键还是归一化思想吧,幂次处理,将很多小细节整体处理

还有,有些时候还是不要想当然,你想的贪心策略未必是对的,如果有条件枚举,就枚举一下,ac就这样来了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

const double eps = 1e-6;

int t[40];

int getfold(int mab,int mib,int maa,int mia)
{
if(mab<maa||mib<mia)
{
return 1e9;
}
else
{
int sum = 0;
int mad = mab/maa;
if(mab%maa > 0)
{
mad++;
}
for(int i=0;i<32;i++)
{
if(t[i] >= mad)
{
sum += i;
break;
}
}
int mid = mib/mia;
if(mib%mia > 0)
{
mid++;
}
for(int i=0;i<32;i++)
{
if(t[i] >= mid)
{
sum += i;
break;
}
}
return sum;
}
}

int main()
{
int W,H,w,h;
t[0] = 1;
for(int i=1;i<32;i++)
{
t[i] = t[i-1]<<1;
}
while(scanf("%d%d%d%d",&W,&H,&w,&h)!=EOF)
{
int a = getfold(W,H,w,h);
int b = getfold(W,H,h,w);
int maxsum = min(a,b);
if(maxsum == 1e9)
{
maxsum = -1;
}
//cout <<a<<b<<endl;
printf("%d\n",maxsum);
}
return 0;
}


文章地址:http://blog.csdn.net/owen_q/article/details/78178543
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐