HPU积分赛 2019.8.18

A题

给出n个数,问这n个数能不能分成奇数个连续的长度为奇数并且首尾均为奇数的序列

Codeforces849A

题解传送门

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 int a[maxm];
12 int main(int argc, char const *argv[])
13 {
14     #ifndef ONLINE_JUDGE
15         freopen("/home/wzy/in.txt", "r", stdin);
16         freopen("/home/wzy/out.txt", "w", stdout);
17         srand((unsigned int)time(NULL));
18     #endif
19     ios::sync_with_stdio(false);
20     cin.tie(0);
21     int n;
22     cin>>n;
23     int sum=0;
24     for(int i=0;i<n;i++)
25     {
26         cin>>a[i];
27         a[i]&=1;
28         sum+=a[i];
29     }
30     if(!(n&1))
31     {
32         cout<<"No\n";
33         return 0;
34     }
35     if(!a[0]||!a[n-1])
36     {
37         cout<<"No\n";
38         return 0;
39     }
40     cout<<"Yes\n";
41     #ifndef ONLINE_JUDGE
42         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
43     #endif
44     return 0;
45 }

B题

Codeforces872A

注意第一行和第二行出现同一个数的情况,记录一下

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 int a[maxn];
12 int b[maxn];
13 int vis[maxn];
14 int main(int argc, char const *argv[])
15 {
16     #ifndef ONLINE_JUDGE
17         freopen("/home/wzy/in.txt", "r", stdin);
18         freopen("/home/wzy/out.txt", "w", stdout);
19         srand((unsigned int)time(NULL));
20     #endif
21     ios::sync_with_stdio(false);
22     cin.tie(0);
23     int n,m;
24     cin>>n>>m;
25     for(int i=0;i<n;i++)
26     {
27         cin>>a[i];
28         vis[a[i]]=1;
29     }
30     for(int i=0;i<m;i++)
31         cin>>b[i];
32     sort(a,a+n);
33     sort(b,b+m);
34     int flag=0;
35     for(int i=0;i<m;i++)
36     {
37         if(vis[b[i]])
38         {
39             cout<<b[i]<<endl;
40             flag=1;
41             break;
42         }
43     }
44     if(!flag)
45         cout<<min(a[0],b[0])<<max(a[0],b[0])<<endl;
46     #ifndef ONLINE_JUDGE
47         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
48     #endif
49     return 0;
50 }

C题

输出四行1.00

D题

不会

E题

给出一个有n个整数的数组 a1, a2, ..., an 和一个整数k。你被要求把这个数组分成k 个非空的子段。 然后从每个k 个子段拿出最小值,再从这些最小值中拿出最大值。求这个最大值最大能为多少?

Codeforces872B

题解传送门

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 int a[maxn];
12 int main(int argc, char const *argv[])
13 {
14     #ifndef ONLINE_JUDGE
15         freopen("/home/wzy/in.txt", "r", stdin);
16         freopen("/home/wzy/out.txt", "w", stdout);
17         srand((unsigned int)time(NULL));
18     #endif
19     ios::sync_with_stdio(false);
20     cin.tie(0);
21     int n,k;
22     cin>>n>>k;
23     int maxx;
24     int place=0;
25     int minn;
26     for(int i=0;i<n;i++)
27     {
28         cin>>a[i];
29         if(!i)
30         {
31             maxx=a[i];
32             place=0;
33             minn=a[i];
34         }
35         else if(maxx<a[i])
36             place=i,maxx=a[i];
37         minn=min(minn,a[i]);
38     }
39     if(k==1)
40         cout<<minn<<endl;
41     else if(k==2)
42         cout<<max(a[0],a[n-1])<<endl;
43     else
44         cout<<maxx<<endl;
45     #ifndef ONLINE_JUDGE
46         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
47     #endif
48     return 0;
49 }

F题

给出一个有n个数的序列a[1],a[2]……a[n],使得在i<=j<=k的条件下,令p*a[i]+q*a[j]+r*a[k]的值最大并输出这个值

Codeforces855D

题解传送门

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 ll Left[maxn];
12 ll Right[maxn];
13 ll a[maxn];
14 int main(int argc, char const *argv[])
15 {
16     #ifndef ONLINE_JUDGE
17         freopen("/home/wzy/in.txt", "r", stdin);
18         freopen("/home/wzy/out.txt", "w", stdout);
19         srand((unsigned int)time(NULL));
20     #endif
21     ios::sync_with_stdio(false);
22     cin.tie(0);
23     int n;
24     ll p,q,r;
25     cin>>n>>p>>q>>r;
26     for(int i=0;i<n;i++)
27         cin>>a[i];
28     Left[0]=a[0]*p;
29     Right[n-1]=a[n-1]*r;
30     for(int i=1;i<n;i++)
31         Left[i]=max(Left[i-1],p*a[i]);
32     for(int i=n-2;i>=0;i--)
33         Right[i]=max(Right[i+1],r*a[i]);
34     ll ans=-INF;
35     for(int i=0;i<n;i++)
36         ans=max(ans,Left[i]+q*a[i]+Right[i]);
37     cout<<ans<<endl;
38     #ifndef ONLINE_JUDGE
39         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
40     #endif
41     return 0;
42 }

G题

排下序就好了

HDU6292

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 int a[maxn];
12 int b[maxn];
13 int main(int argc, char const *argv[])
14 {
15     #ifndef ONLINE_JUDGE
16         freopen("/home/wzy/in.txt", "r", stdin);
17         freopen("/home/wzy/out.txt", "w", stdout);
18         srand((unsigned int)time(NULL));
19     #endif
20     ios::sync_with_stdio(false);
21     cin.tie(0);
22     int t;
23     int _=0;
24     cin>>t;
25     while(t--)
26     {
27         int n,m;
28         cin>>n>>m;
29         for(int i=0;i<n;i++)
30             cin>>a[i];
31         for(int i=0;i<m;i++)
32             cin>>b[i];
33         sort(a,a+n);
34         sort(b,b+m);
35         cout<<"Problem "<<1000+(++_)<<":"<<endl;
36         if(!n)
37             cout<<"Shortest judge solution: N/A bytes."<<endl;
38         else
39             cout<<"Shortest judge solution: "<<a[0]<<" bytes."<<endl;
40         if(!m)
41             cout<<"Shortest team solution: N/A bytes."<<endl;
42         else
43             cout<<"Shortest team solution: "<<b[0]<<" bytes."<<endl;
44     }
45     #ifndef ONLINE_JUDGE
46         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
47     #endif
48     return 0;
49 }

H题

现在有n个整数,在这n个数中找出k个数,保证这k个数中任意两个数差的绝对值可以被m整除。

Codeforces876B

题解传送门

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 int a[maxn];
12 int vis[maxn];
13 bool cmp(int a,int b)
14 {
15     return a>b;
16 }
17 int main(int argc, char const *argv[])
18 {
19     #ifndef ONLINE_JUDGE
20         freopen("/home/wzy/in.txt", "r", stdin);
21         freopen("/home/wzy/out.txt", "w", stdout);
22         srand((unsigned int)time(NULL));
23     #endif
24     ios::sync_with_stdio(false);
25     cin.tie(0);
26     int n,m,k;
27     cin>>n>>k>>m;
28     int cnt=0;
29     int num;
30     int maxx=0;
31     for(int i=0;i<n;i++)
32     {
33         cin>>a[i];
34         if(!vis[a[i]%m])
35             cnt++;
36         vis[a[i]%m]++;
37         if(maxx<vis[a[i]%m])
38             maxx=vis[a[i]%m],num=a[i]%m;
39     }
40     if(maxx<k)
41         cout<<"No\n";
42     else
43     {
44         int res=0;
45         cout<<"Yes\n";
46         for(int i=0;i<n;i++)
47         {
48             if(a[i]%m==num)
49             {
50                 res++;
51                 cout<<a[i]<<" ";
52             }
53             if(res==k)
54                 break;
55         }
56         cout<<"\n";
57     }
58     #ifndef ONLINE_JUDGE
59         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
60     #endif
61     return 0;
62 }

I题

HDU5965

题解传送门

先固定第一个位置的雷的数量,往后递推

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e4+10;
 8 const ll mod=1e8+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 ll a[maxn];
12 // 每一列可以放多少个
13 ll dp[maxn];
14 int main(int argc, char const *argv[])
15 {
16     #ifndef ONLINE_JUDGE
17         freopen("/home/wzy/in.txt", "r", stdin);
18         freopen("/home/wzy/out.txt", "w", stdout);
19         srand((unsigned int)time(NULL));
20     #endif
21     ios::sync_with_stdio(false);
22     cin.tie(0);
23     int t;
24     cin>>t;
25     while(t--)
26     {
27         ms(dp,0);
28         ms(a,0);
29         string s;
30         cin>>s;
31         int l=s.length();
32         for(int i=0;i<l;i++)
33             a[i]=1LL*(s[i]-‘0‘);
34         ll ans=0;
35         // 固定第一个位置的个数
36         for(int i=0;i<3;i++)
37         {
38             if(i>a[0])
39                 break;
40             dp[0]=i;
41             ll pos=1;
42             // 第一个固定之后,枚举后面的每个位置
43             int cnt=0;
44             for(int j=1;j<l;j++)
45             {
46                 int res;
47                 // 第一列前面没有别的了,所以不需要考虑第一列左边的情况
48                 if(j==1)
49                     res=a[j-1]-dp[j-1];
50                 // 第j列需要放的雷的个数
51                 else
52                     res=a[j-1]-dp[j-1]-dp[j-2];
53                 // 符合要求
54                 if(res<=2&&res>=0)
55                     dp[j]=res,cnt++;
56             }
57             // 如果没有枚举到最后一个位置
58             if(cnt!=l-1)
59                 continue;
60             // 如果最后两列放雷数不等于实际的个数,排除掉
61             if(dp[l-1]+dp[l-2]!=a[l-1])
62                 continue;
63             // 计算当第一列为雷数为i的总情况
64             for(int j=0;j<l;j++)
65                 if(dp[j]==1)
66                     pos<<=1,pos%=mod;
67             ans+=pos;ans%=mod;
68         }
69         cout<<ans%mod<<endl;
70     }
71     #ifndef ONLINE_JUDGE
72         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
73     #endif
74     return 0;
75 }

J题

Codeforces913C

题解传送门

注意考虑两种情况

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 struct wzy
12 {
13     ll bigness;
14     ll money;
15     double price;
16 }p[maxn];
17 bool cmp(wzy u,wzy v)
18 {
19     return u.price<v.price;
20 }
21 int main(int argc, char const *argv[])
22 {
23     #ifndef ONLINE_JUDGE
24         freopen("/home/wzy/in.txt", "r", stdin);
25         freopen("/home/wzy/out.txt", "w", stdout);
26         srand((unsigned int)time(NULL));
27     #endif
28     ios::sync_with_stdio(false);
29     cin.tie(0);
30     int n;
31     ll l;
32     cin>>n>>l;
33     for(int i=1;i<=n;i++)
34     {
35         cin>>p[i].money;
36         p[i].bigness=(1LL<<(i-1));
37         p[i].price=1.0*p[i].money/p[i].bigness;
38     }
39     sort(p+1,p+1+n,cmp);
40     ll L=l;
41     ll ans=INF;
42     ll res1=0,res2=0;
43     while(L>0)
44     {
45         for(int i=1;i<=n;i++)
46         {
47             // 全买这个饮料
48             res1=res2+ceil(1.0*L/p[i].bigness)*p[i].money;
49             ans=min(ans,res1);
50             // 多余的部分买别的
51             res2+=L/p[i].bigness*p[i].money;
52             L-=(p[i].bigness*(L/p[i].bigness));
53         }
54     }
55     ans=min(ans,res2);
56     cout<<ans<<endl;
57     #ifndef ONLINE_JUDGE
58         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
59     #endif
60     return 0;
61 }

K题

矩阵快速幂

f[i]=f[i-1]+2*f[i-2]+n^3

HDU6470

题解传送门

L题

暴力枚举就行了

Codeforces879A

代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define ms(a,b) memset(a,b,sizeof(a))
 5 const int inf=0x3f3f3f3f;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 const int maxn=1e6+10;
 8 const int mod=1e9+7;
 9 const int maxm=1e3+10;
10 using namespace std;
11 struct wzy
12 {
13     ll s,d;
14 }p[maxn];
15 int main(int argc, char const *argv[])
16 {
17     #ifndef ONLINE_JUDGE
18         freopen("/home/wzy/in.txt", "r", stdin);
19         freopen("/home/wzy/out.txt", "w", stdout);
20         srand((unsigned int)time(NULL));
21     #endif
22     ios::sync_with_stdio(false);
23     cin.tie(0);
24     int n;
25     cin>>n;
26     for(int i=0;i<n;i++)
27         cin>>p[i].d>>p[i].s;
28     ll ans=p[0].d;
29     for(int i=1;i<n;i++)
30     {
31         ans+=1;
32         ll res=p[i].d;
33         if(res>=ans)
34             ans=res;
35         else
36         {
37             ll pos=ceil(1.0*(ans-res)/p[i].s);
38             ans=res+(p[i].s*pos);
39         }
40     }
41     cout<<ans<<endl;
42     #ifndef ONLINE_JUDGE
43         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
44     #endif
45     return 0;
46 }

原文地址:https://www.cnblogs.com/Friends-A/p/11373368.html

时间: 2024-10-01 22:15:59

HPU积分赛 2019.8.18的相关文章

2019.3.18考试&amp;2019.3.19考试

2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 T2 正反都做一遍DP T3 观察到顺序不影响答案,分块打标记 2019.3.19 肥肠爆芡,因为沙茶博主昨天在学校的煞笔食堂吃坏了肚子,所以这场考试咕咕了 我佛了 一定补这两场.jpg 原文地址:https://www.cnblogs.com/ydnhaha/p/10558495.html

【C语言解惑课堂】解惑内容合集(2019.8.18更新)

我的知识星球:"C语言解惑课堂"截止到2019年8月18日的所有解惑内容如下.要查看详细解析的C语言难点或者需要提问的同学,微信扫扫文末的星球二维码加入吧! 一.基础难点剖析 [第1篇][C语言基础][unsigned short类型用于循环的一个难点] [第2篇][C语言基础][unsigned int溢出] [第3篇][C语言基础][int类型溢出] [第4篇][C语言基础][字符与字符串的区别] [第5篇][C语言基础][&&运算符两边的数值] [第33篇][C语

【单调栈维护连续区间】2019.1.18模拟赛T2 浇花

这道题是一道单调栈的题 1 题目描述 2 JDFZ在餐厅门前种了一排nn棵花,每棵花都有一个高度.浇花大爷会枚举所有的区间,然后从区间中找出一个高度最矮的花进行浇水.由于浇花大爷浇完水之后就精疲力竭了,所以请你帮助他计算每棵花都被浇了几次水. 3 4 输入格式 5 第一行一个整数nn. 第二行nn个整数,分别表示每棵花的高度. 6 7 输出格式 8 一行nn个整数用空格隔开,分别表示每棵花被浇了几次水. 9 10 样例一 11 input 12 3 13 1 3 5 14 output 15 3

2019.2.18接口

父类手机类: 1 package com.phone; 2 3 public abstract class Phone { 4 public String brand; 5 public String type; 6 7 public Phone(String brand, String type) { 8 super(); 9 this.brand = brand; 10 this.type = type; 11 } 12 13 public abstract void send(); 14

2019.4.18训练

今天的题还是挺不错的: 1:codeforces811c 我先贴一个博客上来:https://blog.csdn.net/westbrook1998/article/details/82929293 感觉这个人的思路和我差不多,可能这种题都差不多的做法把............... 网上都差不多,直接上代码把,题解在代码里面: 1 /* 2 首先这道题它给了你ai的范围是0-5000 3 然后它告诉了你如果取一个数,就要取全部的数 4 那么就肯定要处理出全部的段出来,然后接下来的话我们就预处理

学习总结2019.4.18

__init__方法 # 强调: # 1.该方法内可以有任意的python代码 # 2.一定不能有返回值 class People: country='China' x=1 ? def __init__(obj, name, age, sex): #obj=obj1,x='egon',y=18,z='male' # if type(name) is not str: # raise TypeError('名字必须是字符串类型') obj.name = name obj.age = age obj

C++与STL知识点(2019.1.18)

1.作用对象:数组  a[n] 头文件:#include<algorithm> 内容:sort(a,a+n) 功能:进行升序排序 内容:lower_bound(a,a+n,x) 功能:找到大于等于x的位置 int pos=lower_bound(a,a+n,x)-a; 可以判断x是否存在于该数组 如果存在返回x在的位置pos,x=a[pos-1] (n>pos>0) 如果不存在的话放回pos为大于x的下标(n>=pos>=0) 原文地址:https://www.cnbl

jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些边依次加入图中,每次加入之后计算当前图的强连通分量个数并记下来,最后得到一个长度为E 的序列,这个序列就是能力的效果. 注意到,可能存在边的序列不同而能力效果相同的情况,所以羽月想请你帮她计算能发动的不同能力个数,答案对 998244353 取模.你需要对于1<=E<=V*(V-1)的所有 E 计

2019.2.18 区块链论文翻译

Decentralized Privacy-preserving Timed Execution in Blockchain-based Smart Contract Platforms University of Pittsburgh & University of Pittsburgh 定时事务执行对于由基于区块链的智能合约平台提供支持的各种分散式隐私保护应用程序至关重要.这种保护隐私的智能合约应用程序需要能够安全地将用户的敏感输入从区块链中保存到指定的执行时间,然后自动使输入可用,以便在执