A.Planting Trees

排序+模拟

常识问题,将耗时排一个序,时间长的先种,每次判断更新最后一天的时间。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
#define INT 2147483647
#define pi acos(-1.0)
#define eps 1e-3
#define lll __int64
#define ll long long
using namespace std;
#define N 100007 ll a[N]; int main()
{
int i,j,n;
ll now,t;
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%lld",&a[i]);
t = ;
now = ;
sort(a,a+n);
for(i=n-;i>=;i--)
{
now = max(now,t+a[i]);
t++;
}
printf("%lld\n",now+);
return ;
}

B.Boiling Vegetables

暴力

尽可能把每份切成相等的块,这样可以使差距最小化。

枚举最大块在哪种蔬菜中产生,然后枚举切的次数,将这种蔬菜切tim次得到tim+1份,即最大块为w[i]/(tim+1),算出此时至少的基准最小块的大小,然后枚举其他蔬菜来切,也要切成最接近最大块的大小,然后判断:1.总切刀数是否大于最优Best,2.切出来的块是否小于STDMin(基准最小块大小),如果两者有一个为非,退出此次枚举,返回上层。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1027 double w[N]; int main()
{
int i,j,n,tim,Best,flag;
double rati;
scanf("%lf%d",&rati,&n);
for(i=;i<=n;i++)
scanf("%lf",&w[i]);
Best = ;
for(i=;i<=n;i++) //枚举要切成最大块的那一种蔬菜
{
for(tim=;tim<Best;tim++) //枚举这种蔬菜被切的次数,不多于Best次
{
double Bigest = w[i]/(tim+); //最大块
double STDMin = Bigest*rati; //基准最小块
int Tcuts = tim;
flag = ;
for(j=;j<=n && flag;j++) //切其他的
{
if(j == i)
continue;
int Cuts = (int)ceil(w[j]/Bigest) - ; ////达到最大块以下需要切的刀数
if(w[j]/(Cuts+) < STDMin) //切Cuts刀,分成Cuts+1份后如果每份小于基准最小块
flag = ;
Tcuts += Cuts;
if(Tcuts >= Best)
flag = ;
}
if(flag && Tcuts < Best)
Best = Tcuts;
}
}
printf("%d\n",Best);
return ;
}

C.Number Trick

首先x>=10.0肯定没戏,因为首先位数就不等了。

设此数为A,有n位数,第一位为A0,则有A*X = (A - 10^(n-1))*10 + A0 (1)

进而得出:

      (2)

枚举位数n和第一位A0,得出A,再验证A是否合法:1.A/10^(n-1) = A0 (第一位是A0)2.是否满足(1)式

如果满足,输出。这题精度问题很烦。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define eps 1e-5
#define ll long long
using namespace std;
#define N 2027 int main()
{
int i,n;
double x;
cin>>x;
if(x >= 10.0)
{
puts("No solution");
return ;
}
int A0;
int flag = ;
ll P = ;
for(n=;n<=;n++)
{
for(A0=;A0<=;A0++)
{
ll A = (*P-)*A0/(-x) + 0.5;
if(A/P == A0 && fabs((A-A0*P)*+A0-A*x) < eps)
{
printf("%lld\n",A);
flag = ;
}
}
P *= ;
}
if(!flag)
puts("No solution");
return ;
}

D.Robert Hood

枚举

不要被100000一点吓到了,要对题目中的数字敏感,看到坐标值在(-1000~1000)之间,并且全是整数点的时候,想到有没有平方级的复杂度。

将二维化成一维,我这里化为y轴,其实x轴y轴都是一样的,对每个y轴的坐标值,维护纵坐标为y的一条线上x坐标值最小和x坐标最大的两个值,然后在y轴上以N^2的复杂度枚举(N:最大1000)每对y=Y的线(Y为固定值),设为线A和线B,纵坐标为YA和YB,每次求A的(XAmin,YA)到B的(XBmax,YB)的距离和A的(XAmax,YA)到B的(XBmin,YB)的距离,取一个最大值,循环完后得到结果。

因为坐标值有负,所以统一加上1000。

小技巧:dis函数可以不写sqrt,到最后求出最远距离再做一次sqrt即可,可节省时间。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
#define INT 2147483647
#define lll __int64
#define ll long long
using namespace std;
#define N 2027 int vis[N],minx[N],maxx[N]; double dis(int x1,int y1,int x2,int y2)
{
return (double)sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
} int main()
{
int n,i,j,x,y;
memset(vis,,sizeof(vis));
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&x,&y);
y += ;
if(!vis[y])
{
minx[y] = maxx[y] = x;
vis[y] = ;
}
else
{
if(minx[y] > x)
minx[y] = x;
if(maxx[y] < x)
maxx[y] = x;
}
}
double res = -Mod;
for(i=;i<=;i++)
{
if(vis[i])
{
for(j=i;j<=;j++)
{
if(!vis[j])
continue;
double dis1 = dis(minx[i],i,maxx[j],j);
double dis2 = dis(maxx[i],i,minx[j],j);
res = max(res,max(dis1,dis2));
}
}
}
printf("%.9lf\n",res);
return ;
}

E.Virus Replication

题目比较不好懂。意思是将第一个串的某些连续部分替换为某个子串使整个子串变成第二个串,求这个字串的最小长度(有可能为0)。

做法:从前往后匹配和从后往前匹配,设第一种的失配位置为low,第二种的适配位置为high(low,high的索引皆为其在第二个串的索引),则最小长度为max(0,high-low+1),但是还可能第二个串比第一个串长,这是想替换至少长度为len2-len1,所以考虑res = max(res,len2-len1)。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#define Mod 1000000007
#define INT 2147483647
using namespace std;
#define N 1027 int main()
{
string a,b;
while(cin>>a>>b)
{
int i,j;
int len1 = a.length();
int len2 = b.length();
int low = ;
int high = len2-;
for(i=;i<len1&&i<len2;i++)
{
if(a[i] != b[i])
break;
low++;
}
j = len1-;
for(i=len2-;i>=&&j>=;i--,j--)
{
if(a[j] != b[i])
break;
high--;
}
int res = max(,high-low+);
res = max(res,len2-len1);
printf("%d\n",res);
}
return ;
}

F.Timebumb

模拟题。比较水。

一个一个处理数字,将数字的15个点编号0~15,如果某点为‘*’,则编号1,否则编号0,。如果发现某个数字处不是数字的正确形式,则直接爆炸。否则统计看是否能模6为0.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <string>
using namespace std;
#define N 100007 char ss[][];
int vis[][];
string val[] = {"","","","","","","","","",""};
string vis_to_01(int VIS[])
{
int i;
string res = "";
for(i=;i<;i++)
{
if(VIS[i] == )
res += '';
else
res += '';
}
return res;
} int main()
{
int i,j,k;
int len;
for(i=;i<;i++)
{
gets(ss[i]); }
len = strlen(ss[]);
int ind,lefti;
char dig[];
for(lefti=,ind=;lefti<=len-;lefti+=,ind++)
{
int k = ;
for(i=;i<;i++)
{
for(j=lefti;j<lefti+;j++)
{
if(ss[i][j] == '*')
{
vis[ind][k] = ;
}
else
vis[ind][k] = ;
k++;
}
}
}
int flag = ;
for(i=;i<ind;i++)
{
string now = vis_to_01(vis[i]);
for(j=;j<;j++)
{
if(val[j] == now)
{
dig[i] = j + ;
break;
}
}
if(j == )
{
flag = ;
break;
}
}
int ka = atoi(dig);
if(!flag || ka% != )
puts("BOOM!!");
else
puts("BEER!!");
return ;
}

G.Erase Securely

水。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <string>
using namespace std;
#define N 100007 int main()
{
int n,i,len;
string a,b;
int flag;
scanf("%d",&n);
cin>>a>>b;
if(n%)
flag = ;
else
flag = ;
len = a.length();
for(i=;i<len;i++)
{
if(flag)
{
if(a[i] == b[i])
{
break;
}
}
else
{
if(a[i] != b[i])
break;
}
}
if(i == len)
puts("Deletion succeeded");
else
puts("Deletion failed");
return ;
}

H.Pinball

I.Dance Reconstruction

J.Dartboard

微积分题。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define eps 1e-3
using namespace std;
#define N 100007 double theta;
double calc(double r1,double r2)
{
return exp(-(r1*r1)/(*theta*theta)) - exp(-(r2*r2)/(*theta*theta));
} int main()
{
double r1,r2,r3,r4,r5,r6;
scanf("%lf%lf%lf%lf%lf%lf",&r1,&r2,&r3,&r4,&r5,&r6);
scanf("%lf",&theta);
double res = 50.0*calc(,r1) + 25.0*calc(r1,r2) + 10.5*calc(r2,r3) + 31.5*calc(r3,r4) + 10.5*calc(r4,r5) + 21.0*calc(r5,r6);
printf("%lf\n",res);
return ;
}

K.Cliff Work

(没做出来的以后持续更新)

2014 UESTC 暑前集训队内赛(1) 解题报告的更多相关文章

  1. 2014 UESTC 暑前集训队内赛(3) 部分解题报告

    B.Battle for Silver 定理:完全图Kn是平面图当且仅当顶点数n<=4. 枚举所有完全图K1,K2,K3,K4,找出最大总权重. 代码: #include <iostrea ...

  2. 2014 UESTC 暑前集训队内赛(2) 部分解题报告

    B.Cuckoo for Hashing 模拟题. 代码: #include <iostream> #include <cstdio> #include <cstring ...

  3. 2014 UESTC暑前集训数据结构专题解题报告

    A.Islands 这种联通块的问题一看就知道是并查集的思想. 做法:从高水位到低水位依序进行操作,这样每次都有新的块浮出水面,可以在前面的基础上进行合并集合的操作.给每个位置分配一个数字,方便合并集 ...

  4. 2014 UESTC暑前集训搜索专题解题报告

    A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...

  5. 2014 UESTC暑前集训动态规划专题解题报告

    A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...

  6. 2014 UESTC暑前集训图论专题解题报告

    A.方老师和缘分 http://www.cnblogs.com/whatbeg/p/3765621.html B.方老师和农场 http://www.cnblogs.com/whatbeg/p/376 ...

  7. HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

    题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...

  9. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

随机推荐

  1. jQuery中each()、find()、filter()等节点操作方法

    1.each(callback) 官方解释: 返回值:jQuery 概述 以每一个匹配的元素作为上下文来执行一个函数. 意味着,每次执行传递进来的函数时,函数中的this关键字都指向一个不同的DOM元 ...

  2. 默认选中ComboBox的某一项

    如: 让它选中“统计今天”(控件Name为cobListTime) 方法: 1.cobListTime.Text = cobListTime.Items[0].ToString();//默认选中第一个 ...

  3. Git分支(远程)

    1.远程分支的表示形式:远程仓库名称/分支名,如:origin/master:   2.一次Git克隆会建立你自己的本地分支:master和远程分支:origin/master,它们都指向origin ...

  4. centos/rhel 6.5下rabbitmq安装(最简单方便的方式)

    wget -c http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.r ...

  5. C++之函数重载

    函数重载定义: 如果同一作用域内的几个函数名字相同但形参列表不同; 重载与const形参: Record (Phone); = Record(const Phone); Record(Phone*) ...

  6. C#中List<T>对象的深度拷贝问题

    一.List<T>对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List<T&g ...

  7. C语言接口与实现实例

    一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实 ...

  8. 限制UITextField输入内容的长度

    一.前言 今天做手机号输入限制长度,例如我的textfield只能输入11位,如果再多输入的话就不再textfield中显示,只显示11位的手机号. 如果用ReactiveCocoa的话,这个很好解决 ...

  9. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  10. Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照

    原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...