2016 CCPC Hangzhou Onsite
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的更多相关文章
- 2016 CCPC 东北地区重现赛
1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08 HDU5929 Basic Data Structure 模拟,双端队列 1.题意:模拟一个栈的操 ...
- HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)
题目链接 2016 CCPC东北地区大学生程序设计竞赛 B题 题意 给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...
- 2016 ccpc 网络选拔赛 F. Robots
Robots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2016 CCPC长春重现赛
1.2016中国大学生程序设计竞赛(长春)-重现赛 2.总结:会做的太少,应变能力也不行,或者说猜题目的能力不行 02 水 04 HDU 5914 Triangle 1.题意:1~n,n个数,问 ...
- 2016 CCPC 合肥赛区 平行四边形//打铁记录..... 背锅还是我在行 此处@ctr 233
也希望自己记住这些题并不是真的很难很难... 平行四边形... 这个题要两个直线上的两个点和给出点中的两个点组成的平行四边形面积最大. 确定两个点后,发现线上的点随之确定.那么我们解出线上的点 然后求 ...
- 2016 CCPC 杭州站 小结
5题倒数第一,铜……(我就知道我们很稳!!!哼!! 这一次心态完全爆炸 开场我就没有按照平时的顺序读题 然后zr的A题wa 我F题T xl说B是一个最小生成树,又说是最小树形图,不会写 K题完全没思路 ...
- HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢-- 这个变形并不难,跳着选数,把漏掉的位置补上就可以了. 代码如下: #include<iostream ...
- 2016 ccpc 杭州赛区的总结
毕竟是在杭电比的,和之前大连的icpc不同,杭电毕竟是隔壁学校,来回吃住全都是在自家寝室,方便! 不过说到方便也是有点不方便,室友都喜欢玩游戏,即使我昨晚9.30就睡觉了,仍然是凌晨一点才睡着,233 ...
- HDU 5984.Pocky(2016 CCPC 青岛 C)
Pocky Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decora ...
随机推荐
- 用angular中的ng-repeat和ng-show来实现tab选项卡
虽然我们可以用angular中的路由来做tab选项卡,但是那会让我们建立很多的页面来引入,或者建立 <script type="text/ng-template" id=&q ...
- ubuntu16.04下笔记本自带摄像头编译运行PTAM
ubuntu16.04下笔记本自带摄像头编译运行PTAM 转载请注明链接:https://i.cnblogs.com/EditPosts.aspx?postid=9014147 个人邮箱:feifan ...
- Google Now 'not available in your country'
Google Now 'not available in your country' Don't know how to cope with this problem.
- Sum It Up---poj1564(dfs)
题目链接:http://poj.org/problem?id=1564 给出m个数,求出和为n的组合方式:并按从大到小的顺序输出: 简单的dfs但是看了代码才会: #include <cstdi ...
- Python开发【模块】:Urllib(二)
Urllib实战 1.爬取糗事百科中段子和用户名: 代码实例: # 爬取网站页面内容 import re import urllib.request url = 'https://www.qiushi ...
- Disruptor的伪共享解决方案
1.术语 术语 英文单词 描述 内存屏障 Memory Barriers 是一组处理器指令,用于实现对内存操作的顺序限制. In the Java Memory Model a volatile fi ...
- 预训练模型与Keras.applications.models权重资源地址
什么是预训练模型 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型.你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手. ...
- iis6下配置支持.net4.0&发布网站[转]
iis6配置支持.net4.0 在win2003操作系统上发布两个网站,首先配置iis: 1.下载 .net framework 4.0 差不多48MB 2.安装 3.打开iis: 开始=> ...
- Cocos2d-JS实现的打飞机
一.前言 今天我们来讲一个最最最常见的一个小游戏--打飞机!是的,打飞机!还记得小时候在玩儿的雷电,应该是打飞机最早的样子了吧.直到现在,也有微信打飞机,全民飞机大战,全民打飞机等游戏的出现,这些游戏 ...
- C语言——stdio.h
int fgetc(FILE * stream); get character from stream 返回流中的一个字符,并以int的类型返回,如果碰到文件的结尾,或者一个错误发生,函数返回 ...