A:题意:n个格子排成一排,每个a[i],要求重排成k个,每个人数相同,合并两个和划分成两个(可以不等)都是花费为1,问最小花费

题解:从前往后贪心即可,由于哪个地方忘开ll,wa了,全改成ll就过了

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; ll a[N],n,k;
void solve(ll x)
{
ll ans=,res=;
for(int i=;i<=n;i++)
{
if(res!=)ans++,a[i]+=res;
if(a[i]>=x)
{
ll te=a[i]/x;
if(a[i]%x==)te--;
ans+=te;
res=a[i]%x;
}
else res=a[i];
}
printf("%lld\n",ans);
}
int main()
{
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
scanf("%lld%lld",&n,&k);
ll sum=;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
printf("Case #%d: ",_);
if(sum%k!=)puts("-1");
else solve(sum/k);
}
return ;
}
/******************** ********************/

B:题意:n个炸弹,引爆需要花费,引爆后会引爆范围内的炸弹,问最小花费

题解:强连通缩点求dag上度数最小的点,(队友写的,细节不清楚)

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int,pair<int,int>> using namespace std; const int N = + ;
const int M = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ; int n, idx, top, cnt, id[N], dfn[N], st[N], low[N], deg[N];
LL cost[N];
bool in[N]; struct Point {
LL x, y, r, c;
} p[N]; vector<int> edge[N]; void tarjan(int u) {
st[top++] = u; ++idx;
low[u] = dfn[u] = idx;
in[u] = true; for(int v : edge[u]) {
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if(in[v]) {
low[u] = min(low[u], dfn[v]);
}
} if(low[u] == dfn[u]) {
cnt++;
while() {
int now = st[--top];
in[now] = false;
id[now] = cnt;
cost[cnt] = min(cost[cnt], p[now].c);
if(now == u) break;
}
}
} void init() {
idx = ; top = ; cnt = ;
memset(deg, , sizeof(deg));
memset(cost, inf, sizeof(cost));
memset(dfn, , sizeof(dfn));
memset(in, , sizeof(in));
for(int i = ; i <= n; i++)
edge[i].clear();
} LL dis(LL a, LL b, LL c, LL d) {
return ((a - c) * (a - c) + (b - d) * (b - d));
}
int main() {
int T; scanf("%d", &T);
for(int cas = ; cas <= T; cas++) {
init();
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%lld%lld%lld%lld", &p[i].x, &p[i].y, &p[i].r, &p[i].c); for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
if(i == j) continue;
if(dis(p[i].x, p[i].y, p[j].x, p[j].y) <= p[i].r * p[i].r) {
edge[i].push_back(j);
}
}
} for(int i = ; i <= n; i++) {
if(!dfn[i]) tarjan(i);
} for(int u = ; u <= n; u++) {
for(int v : edge[u]) {
if(id[u] != id[v]) {
deg[id[v]]++;
}
}
} LL ans = ; for(int i = ; i <= cnt; i++)
if(deg[i] == )
ans += cost[i];
printf("Case #%d: ", cas);
printf("%lld\n", ans);
}
return ;
}
/*
*/

C:题意:有一辆车,n个记录点,要求车速度只能增加,每次通过记录点的时间为整数,问通过n个记录点的最小时间

题解:把加速看成一瞬间,其他都是匀速,那么有vi=si/ti<=si+1/ti+1,可得ti>=si*ti+1/si+1,从后往前贪心即可

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 10007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; ll a[N],b[N];
int main()
{
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
int n;scanf("%d",&n);
a[]=;
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
for(int i=;i<n;i++)b[i]=a[i+]-a[i];
ll ans=,last=;
for(int i=n-;i>=;i--)
{
int now=b[i]*last/b[i+];
if(b[i]*last%b[i+]!=)now++;
last=now;
ans+=last;
}
printf("Case #%d: %lld\n",_,ans);
}
return ;
}
/******************** ********************/

D:题意:f(y,k)代表y的每一位的k次方之和,给你x,k求满足x=f(y,k)-y的对数

题解:折半枚举,把前5位预处理出来,然后枚举后5位算答案

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int x,kk;
int f[][];
map<ll,int>m[];
void prepare()
{
for(int i=;i<=;i++)
{
f[i][]=;
for(int j=;j<=;j++)f[i][j]=f[i][j-]*i;
}
for(int kk=;kk<=;kk++)
{
for(int i=;i<=;i++)
{
ll te=,ii=i,now=;
for(int j=;j<=;j++)
{
te+=f[ii%][kk]-(ii%)*now;
ii/=;now*=10ll;
}
m[kk][te]++;
}
}
}
void solve()
{
ll ans=;
for(int i=;i<=;i++)
{
ll te=,ii=i,now=;
for(int j=;j<=;j++)
{
te+=f[ii%][kk]-(ii%)*now;
ii/=;now*=10ll;
}
if(m[kk].find(x-te)!=m[kk].end())ans+=m[kk][x-te];
}
printf("%lld\n",ans-(x==));
}
int main()
{
prepare();
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
scanf("%d%d",&x,&kk);
printf("Case #%d: ",_);
solve();
}
return ;
}
/*********************** ***********************/

E:题意:给1到9的每个数字出现次数,你每次选3个数构成x+y=z的等式,问不同的等式最多有多少个

题解:爆搜+剪枝,枚举20种方程,x+y=z,y+x=z算一种,加的时候分开算即可,剪枝:当前方程数+剩余数字数/3<最大答案,剩余方程数+当前方程<最大答案,

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int eq[][]={
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,}
};
int a[],res[];
void dfs(int a[],int id,int now,int &ans)
{
int sum=;
for(int i=;i<=;i++)
{
if(a[i]<)return ;
else sum+=a[i];
}
if(sum/+now<ans)return ;
if(res[id]+now<ans)return ;
if(id==)
{
ans=max(ans,now);
return ;
}
dfs(a,id+,now,ans);
if(a[eq[id][]]>=&&a[eq[id][]]>=&&a[eq[id][]]>=)
{
a[eq[id][]]--;a[eq[id][]]--;a[eq[id][]]--;
dfs(a,id+,now+,ans);
a[eq[id][]]++;a[eq[id][]]++;a[eq[id][]]++;
}
if(eq[id][]!=eq[id][]&&a[eq[id][]]>=&&a[eq[id][]]>=&&a[eq[id][]]>=)
{
a[eq[id][]]-=;a[eq[id][]]-=;a[eq[id][]]-=;
dfs(a,id+,now+,ans);
a[eq[id][]]+=;a[eq[id][]]+=;a[eq[id][]]+=;
}
}
int main()
{
for(int i=;i>=;i--)
{
if(eq[i][]==eq[i][])res[i]=res[i+]+;
else res[i]=res[i+]+;
}
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
for(int i=;i<=;i++)scanf("%d",&a[i]);
int ans=;
dfs(a,,,ans);
printf("Case #%d: %d\n",_,ans);
}
return ;
}
/******************** ********************/

F:题意:给一个1到9组成的字符串,按顺序插入+-*/,求最大的数

题解:由于*/优先级高,而且又是被减的,故越小越好,*/插在最后两位即可,注意有6位时,可能有问题,比如,111991,特判掉就好了,前面的+也是,选一个一位数,和剩余的加看哪个大就选哪个

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 12345678
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; char s[N];
ll cal(int a,int b)
{
ll ans=;
for(int i=a;i<=b;i++)
ans=ans*+(s[i]-'');
return ans;
}
int main()
{
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
printf("Case #%d: ",_);
scanf("%s",s);
int n=strlen(s);
ll ans1=cal(,)+cal(,n-)-cal(n-,n-)*cal(n-,n-)/cal(n-,n-);
ll ans2=cal(,n-)+cal(n-,n-)-cal(n-,n-)*cal(n-,n-)/cal(n-,n-); if(n==){
long long ans=-1e18;
for(int i=;i<n-;i++)
for(int j=i+;j<n-;j++)
for(int k=j+;k<n-;k++)
for(int u=k+;u<n-;u++){
//printf("%d %d %d %d\n",i,j,k,u);
ans1=max(ans1,cal(,i)+cal(i+,j)-cal(j+,k)*cal(k+,u)/cal(u+,n-));
} }
printf("%lld\n",max(ans1,ans2));
}
return ;
}

j:题意:求1到n的每一个数的2的质因子和,

题解:对于每个数x来说可以化成p1^c1*...*pk^ck,对于2^k来说就等价于∑(d|x)|μ(d)|,根据莫比乌斯函数的性质,μ(d)=(-1)^k,d=p1*p2...pk,相当于每次只选k个质因子,然后因为可能为负数,所以变成∑(d|x)μ(d)^2

∑(1<=i<=n)∑(d|i)μ(d)^2,假设j^2是d的最大平方因子,那么∑(k|j)μ(k)=∑(k^2|j^2)μ(k)=∑(k^2|d)μ(k),所以∑(1<=i<=n)∑(d|i)∑(k^2|d)μ(d)=∑(1<=i<=n)μ(k)∑(k^2|d)[n/(k^2)],因为k>sqrt(n)时后面变成了0,所以只需要算前sqrt(n)即可,记忆化后面,μ预处理出来

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; ll n,f[N];
int prime[N],mu[N];
bool notprime[N];
void init()
{
int cnt=;mu[]=;
for(int i=;i<N;i++)
{
if(!notprime[i])prime[++cnt]=i,mu[i]=-;
for(int j=;j<=cnt&&i*prime[j]<N;j++)
{
notprime[i*prime[j]]=;
mu[i*prime[j]]=-mu[i];
if(i%prime[j]==){mu[i*prime[j]]=;break;}
}
}
}
ll cal(ll n)
{
if(n<N&&f[n])return f[n];
ll ans=;
for(ll i=,j;i<=n;i=j+)
{
j=n/(n/i);
ans+=n/i*(j-i+)%mod;
ans%=mod;
}
if(n<N)f[n]=ans;
return ans;
}
int main()
{
init();
int T;scanf("%d",&T);
for(int _=;_<=T;_++)
{
scanf("%lld",&n);
printf("Case #%d: ",_);
ll ans=;
for(ll i=;i<=n/i;i++)
{
if(mu[i]==)continue;
ans+=mu[i]*cal(n/i/i)%mod;
ans=(ans%mod+mod)%mod;
}
printf("%lld\n",ans);
}
return ;
}
/******************** ********************/

K:题意:给你s,n,问你s+1....s+n能不能每个对应一个因子是1到n,而且1到n每个只出现一次

题解:因为如果s+1到s+n和1到n有重叠,那么就选自己,然后剩余的数每个数和因子连边,二分图匹配即可,(也是队友写的)

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int,pair<int,int>> using namespace std; const int N = + ;
const int M = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ; int T, n, s, match[N];
bool edge[N][N], vis[N]; bool path(int u) {
for(int v = ; v <= n; v++) {
if(edge[u][v] && !vis[v]) {
vis[v] = true;
if(!match[v] || path(match[v])) {
match[v] = u;
return true;
}
}
}
return false;
} int main() {
scanf("%d", &T);
for(int cas = ; cas <= T; cas++) {
memset(match, , sizeof(match));
memset(edge, , sizeof(edge));
scanf("%d%d", &n, &s); if(s == || s == ) {
printf("Case #%d: ", cas);
puts("Yes");
continue;
} int l1 = , r1 = n;
int l2 = s + , r2 = s + n;
if(r1 >= l2) {
swap(l2, r1);
l2++; r1--;
} n = r2 - l2 + ;
if(n > ) {
printf("Case #%d: ", cas);
puts("No");
} else {
for(int i = l2; i <= r2; i++) {
for(int j = l1; j <= r1; j++) {
if(i % j == ) {
edge[i - l2 + ][j - l1 + ] = true;
}
}
}
bool flag = true;
for(int i = ; i <= n; i++) {
memset(vis, , sizeof(vis));
if(!path(i)) {
flag = false;
break;
}
}
printf("Case #%d: ", cas);
if(flag) puts("Yes");
else puts("No");
}
}
return ;
}
/*
*/

2016 CCPC Hangzhou Onsite的更多相关文章

  1. 2016 CCPC 东北地区重现赛

    1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08   HDU5929 Basic Data Structure    模拟,双端队列 1.题意:模拟一个栈的操 ...

  2. HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)

    题目链接  2016 CCPC东北地区大学生程序设计竞赛 B题 题意  给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...

  3. 2016 ccpc 网络选拔赛 F. Robots

    Robots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. 2016 CCPC长春重现赛

    1.2016中国大学生程序设计竞赛(长春)-重现赛 2.总结:会做的太少,应变能力也不行,或者说猜题目的能力不行 02  水 04  HDU 5914  Triangle 1.题意:1~n,n个数,问 ...

  5. 2016 CCPC 合肥赛区 平行四边形//打铁记录..... 背锅还是我在行 此处@ctr 233

    也希望自己记住这些题并不是真的很难很难... 平行四边形... 这个题要两个直线上的两个点和给出点中的两个点组成的平行四边形面积最大. 确定两个点后,发现线上的点随之确定.那么我们解出线上的点 然后求 ...

  6. 2016 CCPC 杭州站 小结

    5题倒数第一,铜……(我就知道我们很稳!!!哼!! 这一次心态完全爆炸 开场我就没有按照平时的顺序读题 然后zr的A题wa 我F题T xl说B是一个最小生成树,又说是最小树形图,不会写 K题完全没思路 ...

  7. HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

    这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢-- 这个变形并不难,跳着选数,把漏掉的位置补上就可以了. 代码如下: #include<iostream ...

  8. 2016 ccpc 杭州赛区的总结

    毕竟是在杭电比的,和之前大连的icpc不同,杭电毕竟是隔壁学校,来回吃住全都是在自家寝室,方便! 不过说到方便也是有点不方便,室友都喜欢玩游戏,即使我昨晚9.30就睡觉了,仍然是凌晨一点才睡着,233 ...

  9. HDU 5984.Pocky(2016 CCPC 青岛 C)

    Pocky Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decora ...

随机推荐

  1. Android 小例子服务端

    这是之前发布的Android项目的服务端源码,只是简单的根据请求返回了一些测试数据,没有实现对数据库的操作,可以根据需求自己实现. 这是mvc4 WebAPI项目,需要用vs2012打开. 如果是用的 ...

  2. windows 文件查找 大小:>250M

    win7怎么快速查找大文件_百度经验 https://jingyan.baidu.com/article/acf728fd299ffff8e510a333.html

  3. uchome 常用函数示例

    一.inserttable //添加数据 //前3个参数 $tablename插入的表名称 $insertsqlarr数据数组 $returnid是否返回插入ID function inserttab ...

  4. PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

    REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP.如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP. HTTP_CLIENT_IP 是代理服务器发送的HTTP头. ...

  5. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  6. 【原创】PHPstorm本地修改同步保存到远程服务器

    PHPstorm设置本地修改的代码同步保存到远程服务器: 设置里面搜索“Deployment”,选择+号,然后选择SFTP: 填写远程主机的信息: 然后选择Mappings,填写本地代码路径和远程主机 ...

  7. springboot的相关信息

    Maven的配置:zzp_settings.xml <?xml version="1.0" encoding="UTF-8"?> <setti ...

  8. (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)

    引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool ...

  9. 独家揭秘,106岁的IBM靠什么完成了世纪大转型|钛度专访

    IBM大中华区董事长陈黎明 到2017年2月,陈黎明就担任IBM大中华区董事长整整两年了. 五年前,IBM历史上首位女CEO也是第9位CEO罗睿兰上任,三年前,IBM在罗睿兰的带领下以数据与分析.云. ...

  10. Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)

    Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实例系列文章的第3篇,该系列所有文章链接如下: http://www.cnblogs.com/aierong/a ...