【2012天津区域赛】部分题解 hdu4431—4441

时间:2023-01-22 22:08:38

1001:

题意:
给你13张麻将牌,问可以胡哪些张

思路:

枚举可能接到的牌,然后dfs判断能否胡

1002:

题意:

已知n,m 求 n的所有约数在m进制下的平方和

做法:
队长用java高精度写的

代码:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.io.ObjectInputStream.GetField;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner; public class Main { static BigInteger getSum(int i, int base){
BigInteger ans= BigInteger.ZERO;
BigInteger divider = BigInteger.valueOf(i);
String s = divider.toString(base); for (int j = 0; j < s.length(); j++) {
BigInteger k = new BigInteger(s.substring(j, j + 1),
base);
ans = k.multiply(k).add(ans);
}
return ans;
} public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out)); while (cin.hasNext()) {
int n = cin.nextInt();
int base = cin.nextInt(); BigInteger ans = BigInteger.ZERO;
for (int i = 1; i * i <= n; i++){
if (n % i == 0) {
// i是divider
ans = ans.add(getSum(i, base));
if(i*i!=n)
ans = ans.add(getSum(n/i, base));
} }
cout.println(ans.toString(base).toUpperCase());
} cin.close();
cout.close();
} }

1003:

题意:
给定一串数,每次有三种操作:

1.把当前数加/减1

2.当前数和后面一个数加/减1

3.当前数和后面两个数加/减1

(加减完后的结果是在0~9循环的)

求把当前状态变到目标状态需要的最小操作数

做法:

处理到每个数的时候最多对后面两个数产生影响,因此十进制最多有 10^2=100 种情况,可以全部存下
可以进行dp,dp[i][j]表示前i个数已经达到目标状态 ,第i+1个数和第i+2个数的被操作情况为j(状压一下)的最小操作数,转移只需要枚举三种操作的次数即可

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define inf 100000
int mod(int x)
{
if(x>=)
return x%;
else
return (+x%)%;
}
char s[];
char to[];
int dp[][];
int num[];
int tmp[];
int p[]= {,,};
int main()
{
while(scanf("%s%s",s+,to+)!=EOF)
{
memset(dp,0x3f,sizeof(dp));
dp[][]=;
int n=strlen(s+);
for(int i=; i<=n; i++)
{
for(int j=; j<; j++)
{
if(dp[i-][j]>=inf)
continue;
for(int k=; k<; k++)
{
num[k]=(j%p[k+])/p[k];
}
int cha=mod(to[i]-s[i]-(num[]-));
for(int a=; a<=cha; a++)
{
for(int b=; a+b<=cha; b++)
{
int c=cha-a-b;
tmp[]=num[]-+b+c;
tmp[]=tmp[]%+;
tmp[]=c+;
dp[i][tmp[]+tmp[]*]=min(dp[i][tmp[]+tmp[]*],dp[i-][j]+cha);
}
}
cha=-cha;
for(int a=; a<=cha; a++)
{
for(int b=; a+b<=cha; b++)
{
int c=cha-a-b;
tmp[]=-(-num[]+b+c)%;
tmp[]=-c;
dp[i][tmp[]+tmp[]*]=min(dp[i][tmp[]+tmp[]*],dp[i-][j]+cha);
}
}
}
}
//printf("%d\n",dp[1][9+9*20]);
//printf("%d\n",dp[2][9+10*20]);
printf("%d\n",dp[n][]);
}
return ;
}

1005:

题意:

一个图有n个点,初始在点1,每次加满油后最多能跑d距离,现在点1有一个加油站,问环游全程回到1需要怎么建加油站

第i点建加油站的话 二进制第i位为1,答案要满足建造情况的二进制数最小

做法:

贪心,要尽量要高位的点不建,先假设所有点建了,再从大到小考虑,如果当前点不建也能满足需求,则把该点加油站删去

因为要考虑连通性所以判断是否满足需求要用bfs

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
#include<queue>
#include<math.h>
using namespace std;
int g[][];
int x[];
int y[];
int vi[];
int vis[];
int n,d;
queue<int>q;
int check()
{
memset(vis,,sizeof(vis));
while(!q.empty())
q.pop();
q.push();
while(!q.empty())
{
int now=q.front();
vis[now]=;
q.pop();
for(int i=;i<n;i++)
{
if(!vis[i])
{
if(g[now][i]<=d/)
{
vis[i]=;
}
if(g[now][i]<=d&&vi[i])
{
q.push(i);
}
}
}
}
for(int i=;i<n;i++)
{
if(vis[i]==)
return ;
}
return ;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&d)!=EOF)
{
for(int i=;i<n;i++)
{
vi[i]=;
}
for(int i=; i<n; i++)
{
scanf("%d%d",x+i,y+i);
}
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
g[i][j]=ceil(sqrt((double)((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))));
}
}
if(check()==)
{
puts("-1");
continue;
}
for(int i=n-; i>=; i--)
{
vi[i]=;
if(!check())
vi[i]=;
}
int f=;
for(int i=n-; i>=; i--)
{
if(vi[i])
{
printf("");
f=;
}
else
{
if(f==)
printf("");
}
}
puts(""); }
return ;
}

1006:

题意: n个字符串,对于每一个子串可以表示为一个数字, 求所有子串的数字和相加对2012取模,, 相同数字只算一次。

这题可以先把n个字符串用一个没有出现过的字符隔开连起来。然后求sa, lcp。

我们可以先看一个简单的例子。

s = 12345

num[1] = 1             sum[1] = 1

num[2] = 12           sum[2] = 1 + 12

num[3] = 123         sum[3] = 1 + 12 + 123

num[4] = 1234       sum[4] = 1 + 12 + 123 + 1234

num[5] = 12345     sum[5] = 1 + 12 + 123 + 1234 + 12345

如果求[3, 4]  , 只需要 sum[5] - sum[2] - num[2] * (10 + 100 + 1000);

判重时 只要从 i+ lcp[rank[i]]  开始算就可以了,,因为公共前缀那一部分 在前面已经算了。

上代码。。

 #include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const double eps = 1e-;
const int mod = ;
const int maxn = 2e5+;
int sum [maxn], num[maxn];
string s;
int sa[maxn], Rank[maxn], tmp[maxn], lcp[maxn];
int k, len;
bool cmp(int i, int j)
{
if (Rank[i] != Rank[j])
return Rank[i] < Rank[j];
else
{
int x = (i+k <= len ? Rank[i+k] : -);
int y = (j+k <= len ? Rank[j+k] : -);
return x < y;
}
}
void build_sa()
{
for (int i = ; i <= len; i++)
{
sa[i] = i;
Rank[i] = (i < len ? s[i] : -);
}
for (k = ; k <= len; k *= )
{
sort (sa,sa+len+,cmp);
tmp[sa[]] = ;
for (int i = ; i <= len; i++)
{
tmp[sa[i]] = tmp[sa[i-]] + (cmp(sa[i-],sa[i])? : );
}
for (int i = ; i <= len; i++)
Rank[i] = tmp[i];
}
} void Get_lcp()
{
for (int i = ; i < len; i++)
Rank[sa[i]] = i;
int h = ;
lcp[] = ;
for (int i = ; i < len; i++)
{
int j = sa[Rank[i]-];
if (h > )
h--;
for (; h+i < len && h+j < len; h++)
if (s[i+h] != s[j+h])
break;
lcp[Rank[i]] = h;
}
}
bool isdigit(char &ch)
{
return ch >= '' && ch <= '';
}
int vec[maxn], board[maxn], tot;
int SUM[maxn];
int solve (int l, int r)
{
if (l > r)
return ;
int res ;
res = sum[r] - sum[l-];
res = ((res%mod)+mod)%mod;
res -= num[l-] * SUM[r-l+];
res = ((res%mod)+mod)%mod;
return ((res%mod)+mod)%mod;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
SUM[] = ;
for (int i = ; i < maxn; i++)
{
SUM[i] = (SUM[i-] + ) * % mod;
}
while (~scanf ("%d", &n))
{
s = "\0";
tot = ;
memset(sum, , sizeof(sum));
memset(num, , sizeof(num));
for (int i = ; i < n; i++)
{
string tmp;
cin >> tmp;
s += tmp + "#";
}
len = s.size();
int val = ;
for (int i = ; i < len; i++)
{
if (s[i] != '#')
{
val = (val * + s[i] - '') % mod;
num[i] = val;
sum[i] = (sum[i-] + num[i]) % mod;
board[i] = tot;
}
if (s[i] == '#')
{
vec[tot++] = i;
num[i] = val;
sum[i] = sum[i-] + val;
}
}
build_sa();
Get_lcp();
int ans = ;
for (int i = ; i < len; i++)
{
int t1 = i + lcp[Rank[i]];
if (s[i] == '')
continue;
if (isdigit(s[i]) && i+lcp[Rank[i]] < vec[board[i]])
{
int t2 = vec[board[i]] -;
int ans1 = solve(i, t2);
int ans2 = solve(i , t1-);
ans = (ans + solve(i, t2) - solve(i, t1-)) % mod;
if (ans < )
ans += mod;
}
}
printf("%d\n", ans%mod);
}
return ;
}

1008:

题意:

很简单的高中数学签到题

思路:

代码:

#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const double eps = 1e-;
double x, y;
double p, q;
double fun1()
{
double a1 = q*p*p*(x+y);
double a2 = q*p*(-p)*x;
double a3 = q*p*(-p)*y;
double a4 = (-q)*x;
return a1+a2+a3+a4;
}
double fun2()
{
double a1 = (-q) * p*p*(x+y);
double a2 = (-q)*p*(-p)*x;
double a3 = (-q)*p*(-p)*y;
double a4 = (q)*y;
return a1+a2+a3+a4;;
}
int main()
{ int t;
cin>>t;
while (t--)
{
scanf ("%lf%lf%lf%lf",&x, &y, &p, &q);
if (fun1() > fun2())
{
printf("tiger %.4f\n", fun1());
}
else
printf("wolf %.4f\n", fun2());
}
return ;
}

1011:

【2012天津区域赛】部分题解 hdu4431—4441的更多相关文章

  1. 【2012长春区域赛】部分题解 hdu4420—4430

    这场比赛特点在于两个简单题太坑,严重影响了心情..导致最后只做出两题....当然也反映出心理素质的重要性 1002: 题意:一个矩阵b[n][n]通过数组 a[n]由以下规则构成,现在已知b[n][n ...

  2. HDU4436---str2int 后缀树组(12年天津区域赛)

    str2int Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  3. 2018-2019 ACM-ICPC 徐州区域赛 部分题解

    题目链接:2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest A. Rikka with Minimum Spanning Trees 题意: 给出一个随 ...

  4. hdu 4463 有一条边必须加上 (2012杭州区域赛K题)

    耐克店 和 苹果店必须相连 Sample Input42 30 01 00 -1 1 -10 Sample Output3.41 # include <iostream> # includ ...

  5. ICPC2019上海区域赛 部分题解&lpar;正在更新&rpar;

    K. Color Graph 题意: 给定一个简单图,点个数<=16,删去部分边后,使得该图中无边数为奇数得环,问剩下的边数最大为多少? 思路: 如果一个图中无奇数边的环,那么这个图一定是个二分 ...

  6. HDU 4438 Hunters 区域赛水题

    本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...

  7. 【2013南京区域赛】部分题解 hdu4802—4812

    上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...

  8. 2014年亚洲区域赛北京赛区现场赛A&comma;D&comma;H&comma;I&comma;K题解&lpar;hdu5112&comma;5115&comma;5119&comma;5220&comma;5122&rpar;

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

  9. UVALive 7146 (贪心&plus;少许数据结构基础)2014acm&sol;icpc区域赛上海站

    这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看 ...

随机推荐

  1. 【已解决】WinPhone模拟器报错:模拟器没法确定来宾虚拟机通信的主机ID地址。某些功能已被禁用

    先看警告 再看错误信息 计算机管理打不开就==>Win+R ==>compmgmt.msc 发现,dnt在管理员权限组里面,也在Hyper-V权限组里面 看看Hyper-V的驱动有木有被禁 ...

  2. 转,SelectNodes &plus; XPath

    XPath 是 XML 的内容,这里 SelectNodes 是 C# 中 XmlDocument 或 XmlNode 的一个方法.SelectNodes 使用 XPath 来选取节点. 重要语法 S ...

  3. 旧文&mdash&semi;冬日感怀

    冬日感怀   下雪了,虽不大,可那雪花落在手上,融在心里,便泛起淡淡的温柔,因为这是冬日的馈赠啊,是上苍的礼物,是往昔记忆的灰烬化作天地间的精灵装点纷繁琐碎的世界.于是,透过汽车上雾气氤氲的玻璃窗,人 ...

  4. Chrome 开发者工具有了设备模拟器

    今天从哥们那里学到了一个小技巧,使用chrome自带的多设备模拟器来调试页面在不同设备下的显示效果. 特地上网查了一下,记录一下. 如果想要在 Chrome 上测试网站在不同设备,不同分辨率的显示情况 ...

  5. ubuntu默认root密码

    安装完Kubuntu后一直都是用我的用户名bbking登录, 一直没想到root的问题, 以为每次sudo输入的密码就是我的root密码. 刚才为了修改文件夹的所有者,想使用su root切换到roo ...

  6. jQuery设置checkbox全选(区别jQuery版本)

    jQuery设置checkbox全选在网上有各种文章介绍,但是为什么在我们用他们的代码的时候就没有效果呢? 如果你的代码一点错误都没有,先不要急着怀疑人家代码的正确性,也许只是人家跟你用的jQuery ...

  7. Teacher implements java&period;io&period;Serializable

    package JBJADV003; public class Teacher implements java.io.Serializable{ private String name; privat ...

  8. nodejs&comma; 阿里oss上传下载图片

    const archiver = require('archiver')const send = require('koa-send')const oss = require('ali-oss').W ...

  9. Spring学习-01

    一.Srping 一个轻量级DI.IOC.AOP的容器框架 DI:依赖注入 IOC:控制反转 AOP:面向切面 二.构造器注入 Constructor-arg 属性:index/name/type/r ...

  10. Vue(九)小案例 - 百度搜索列表(跨域)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...