感觉今天都好没状态啊。
A HDU 5702 Solving Order
——————————————————————————————————————
结构体排序没什么好说的。。
B HDU 5703 Desert
——————————————————————————————————————
给你一个整数,问你划分方法有多少种,然后用二进制输出,{1,2}{2,1}算两种
退了一下,发现 结果就是 2n−1
所以输出个
1
,和
C HDU 5704 Luck Competition
——————————————————————————————————————
n(2~100)个人参加一个游戏,
每个人选择1~100范围的数。
然后得到所有数的平均数,再*=2/3,设得到的数为m。
如果一个人选的数,比m小,且相距m最为接近,那么其便在所有选数相同的人中等概率中奖。
现在,我们也参加比赛,其他n-1个人所选择的数也已经确定了,并且我们知道。
问你,选什么数拥有最高中奖率,并输出。
数据量比较小,暴力枚举然后在模拟计算就行了
#include <bits/stdc++.h>
using namespace std;
int vis[150];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int n;
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
int x;
scanf("%d",&x);
vis[x]++;
}
double P=-1;
int output=-1;
for(int ans=100;ans>=0;ans--)
{
vis[ans]++;
int sum=0;
for(int j=0;j<=100;j++)
{
sum+=vis[j]*j;
}
double ave=sum;
ave=(ave/(double)n);
ave*=2;
ave=ave*1.0/3.0;
if(ans<=ave)
{
int pos;
for(int j=(int)ave;j>=0;j--)
{
if(vis[j]>0)
{
pos=j;
break;
}
}
if(pos==ans)
{
double pp=1/(double)vis[ans];
if(pp>P)
{
P=pp;
output=ans;
}
}
else
{
if(0>P)
{
P=0;
output=ans;
}
}
}
vis[ans]--;
}
printf("%d %.2f\n",output,P);
}
}
D HDU 5705 Clock
——————————————————————————————————————
给你一个时间,问你下一次时针和分针夹角为a度的时刻是多少,如果不是整数则把秒数向下取整
暴力模拟即可,
为了方便比较 可以扩大倍数,使得时针1s动1个单位
#include <bits/stdc++.h>
#define maxs 20002020
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
#define abs(x) ((x)<0?-(x):(x))
int deg(int &h,int &m,int &s){
int hh = (h*60*60+m*60+s);
int mm = (h*60*60+m*60+s)*12;
hh %= 720*60;
mm %= 720*60;
int t = abs(hh-mm);
return min(t,720*60-t);
}
void add1(int &h,int &m,int &s){
s++;
if(s == 60){
m++;
s=0;
}
if(m == 60) {
h++;
m=0;
}
if(h == 12){
h = 0;
}
}
int main(){
// h 1/720 1
// m 1/60 12
// s 1 720
int _ = 1,kcase=0;
int h,m,s,x,p,tp,th,tm,ts;
while(~scanf("%d:%d:%d",&h,&m,&s)){
scanf("%d",&x); x*=120;
p = deg(h,m,s);
while(true){
th=h,tm=m,ts=s;
add1(h,m,s);
tp = deg(h,m,s);
if(tp == x) break;
if(tp<x&&p>x){
h=th,m=tm,s=ts;
break;
}
if(x<tp&&p<x){
h=th,m=tm,s=ts;
break;
}
p=tp;
// printf("%d:%d:%d %d - %d\n",h,m,s,tp,x);
}
printf("Case #%d: %02d:%02d:%02d\n",++kcase,h,m,s);
}
return 0;
}
E HDU 5706 GirlCat
——————————————————————————————————————
一个n*m的网格,每个格子有一个字母 ,问你能构成的girl和cat的个数
爆搜即可
#include <bits/stdc++.h>
#define maxs 202002
using namespace std;
int ok;
int n,m;
char a[1005][1005];
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
void Dfs(int x,int y,int num)
{
if(num==0)if(a[x][y]!='g')return ;
if(num==1)if(a[x][y]!='i')return ;
if(num==2)if(a[x][y]!='r')return ;
if(num==3)if(a[x][y]!='l')return ;
if(num==3)
{
ok++;
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(xx>=0&&x<n&&yy>=0&&yy<m)
{
Dfs(xx,yy,num+1);
}
}
}
void Dfs2(int x,int y,int num)
{
if(num==0)if(a[x][y]!='c')return ;
if(num==1)if(a[x][y]!='a')return ;
if(num==2)if(a[x][y]!='t')return ;
if(num==2)
{
ok++;
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(xx>=0&&x<n&&yy>=0&&yy<m)
{
Dfs2(xx,yy,num+1);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%s",a[i]);
int output=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='g')
{
ok=0;
Dfs(i,j,0);
output+=ok;
}
}
}
printf("%d ",output);
output=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='c')
{
ok=0;
Dfs2(i,j,0);
output+=ok;
}
}
}
printf("%d\n",output);
}
}
F HDU 5707 Combine String
——————————————————————————————————————
给你三个字符串,问你能不能将a,b合并成c,且a,b字符串的字母顺序不被改变
设f[i][j] 表示当前,到达a[i],b[j]的时候,能不能凑成c[0~i+j-1],,
转移的时候就是
#include<bits/stdc++.h>
typedef long long int LL;
using namespace std;
#define abs(x) ((x)>0?(x):-(x))
const int N = 100000+7;
const int M = 10000000+7;
/***************************************************/
char a[2222],b[2222],c[2222];
int f[2222][2222];
int main(){
while(~scanf("%s",a)){
scanf("%s",b);
scanf("%s",c);
int la=strlen(a);
int lb=strlen(b);
int lc=strlen(c);
if(lc!=la+lb){
puts("No");
continue;
}
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=0;i<=la;i++)for(int j=0;j<=lb;j++){
if(i==0&&j==0) continue;
if(i>0&&a[i-1]==c[i+j-1]) f[i][j] |=f[i-1][j];
if(j>0&&b[j-1]==c[i+j-1]) f[i][j] |=f[i][j-1];
}
puts(f[la][lb]?"Yes":"No");
}
return 0;
}
G HDU 5708 Alice and Bob
——————————————————————————————————————
两个人走格子,从(1,1)开始走 ,每次可以从(x,y)走到(x+1,y),(x,y+1),(x+k,y+k)
轮到谁的时候不能走了 就输了.
两个人足够聪明 然后问你谁能赢,Alice先
手写了几组k,然后发现有一个规律, 然后就打表观察了下 ,然后就总结了下规律然后AC.了..
这个规律有点不好描述 自己看吧 打表代码为solve()函数
#include <bits/stdc++.h>
#define maxs 20002020
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
#define abs(x) ((x)<0?-(x):(x))
int a[111][111],b[111][111];
void solve(){
int n = 20;
int m = 20;
int k = 4;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0){
a[i][j+1]=1;
a[i+1][j]=1;
a[i+k][j+k]=1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
printf(" %d",a[i][j],i+j);
puts("");
}
return ;
}
int main(){
// solve();
int _ = 1,q,k,n,m;
for(scanf("%d",&_);_--;){
scanf("%d%d",&q,&k);
for(int i=1;i<=q;i++){
scanf("%d%d",&n,&m);
if(n<m) swap(n,m);
int flag = m/(k+1);
if(k == 1){
if(n%2==0||m%2==0) puts("Alice");
else puts("Bob");
}
else {
if(m%(k+1)==0||(m-flag+n)&1) puts("Alice");
else puts("Bob");
}
}
}
return 0;
}
H HDU 5709 Claris Loves Painting
——————————————————————————————————————
有n(<=1e5)个点的树,每个点都有颜色(颜色可能重复),有m(<=1e5)个询问,每次询问(x,d)问在x的子树中,与x的距离不超过d的节点有多少种不同的颜色。强制要求在线。
维护两颗线段树,并还要有合并的操作,不是特别懂….
看claris的博客吧
I HDU 5710 Digit-Sum
——————————————————————————————————————
我们要找出最小的正整数n满足——
a*S(n)==b*S(2n)
a,b的范围都在[1,100]
s(x)为x的所有位的和
首先能明确的是
s(2n)=2s(n)−9L _ L为n里面大于5的数字的个数
因为大于
5
就会进位,相当于
所以有
- a=2b ,则 L=0 ,S为任意值。可得最小的 n=1 ;
-
a>2b
,则
L<0
,矛盾!则无满足的
n
,输出
0 ; - a<2b , S=9bL2b−a≤5L (至少有L个5),即必须满足 b≤5a ,否则无满足的n,输出0。
然后考虑数n的选取,
我们假设有l的长度是[0,4]范围,有L的长度是[5,9]范围
我们不妨假设答案n仅有长度为L,且每一位都是5
然后得到了把数位和sum分撒出去。
对于sum余下的数值,我们依次加到尾巴上。
如果sum最后把长度为L的字串都填充为‘9‘之后,还有剩余,那么在前面贪心填充。
J HDU 5711 Ingress
——————————————————————————————————————
n(16)个点
m(n^2)条双向边
K(50)次hack机会
最远走L(2000)路程
队友补的 我还不会 待补…