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. Linq初探

    1.什么是LINQ LINQ是语言集成查询(Language Integrated Query),这项技术是在.net 3.5就已经引入的技术,极大的方便了数据的查询,他可以支持数据库.XML.ADO ...

  2. Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...

  3. 为linux扩展swap分区

    1.查看当前swap分区使用情况 [root@localhost ~]# swapon -s Filename Type Size Used Priority /dev/sda2            ...

  4. scrapy爬虫系列之四--爬取列表和详情

    功能点:如何爬取列表页,并根据列表页获取详情页信息? 爬取网站:东莞阳光政务网 完整代码:https://files.cnblogs.com/files/bookwed/yangguang.zip 主 ...

  5. Python基础之软件目录结构规范

    设计一个层次清晰的目录结构,就是为了达到这两点: 可读性高:不熟悉项目的人,一眼就能看懂目录结构. 可维护性高:随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好. 目录组织方式 ...

  6. KVM中断虚拟化浅析

    2017-08-24 今天咱们聊聊KVM中断虚拟化,虚拟机的中断源大致有两种方式,来自于用户空间qemu和来自于KVM内部. 中断虚拟化起始关键在于对中断控制器的虚拟化,中断控制器目前主要有APIC, ...

  7. 【Linux学习 】Linux使用Script命令来记录并回放终端会话

    一背景 二script命令简介 1 什么script命令 2 script命令操作 21 file选项 22 options选项 23 退出script 三Script命令结合实际使用场景 1 先在终 ...

  8. (2.16)Mysql之SQL基础——函数

    (2.16)Mysql之SQL基础——函数 关键词:mysql函数,mysql自定义函数,mysql聚合函数,mysql字符串函数,mysql数值函数 1.自定义函数 -- (1)一般形式 creat ...

  9. js-jquery-SweetAlert2【二】配置与方法

    一.配置 Argument Default value   Description title null 模态对话框的标题.它可以在参数对象的title参数中设置,也可以在swal()方法的第一个参数 ...

  10. Visual Studio 2017企业版 Enterprise 注册码 专业版Professional 激活码key

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QFVisual Studio 2017(VS2017 ...