codeforces round #653
程序员文章站
2024-03-14 18:36:53
...
给出x,y,n;
找到最大的k(0<k<n),使得k%x=y.
因为k%x=y;
tx+y=k。t取最大值
n/xx+y观察是否大于n
若>n则输出(n-1)*x+y
若<n则输出(n+1) *x+y.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int x,y,n;
cin>>x>>y>>n;
if(n/x*x+y>n)
cout<<(n/x-1)*x+y<<endl;
else
cout<<(n/x)*x+y<<endl;
}
return 0;
}
给出n
可以有两种步
- 将n*2
- 将n/6
可以看出2和3为n的最小质因子,否则无法将其除为1.
可以将两部规划成一步为除3
n/3,只不过其计算步数时仍要进行两步操作。
由此给出代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int sum_2=0;
int sum_3=0;
while(n%6==0)
{
n/=6;
sum_2+=1;
}
while(n%3==0)
{
n/=3;
sum_3+=2;
}
if(n==1)
cout<<sum_3+sum_2<<endl;
else
cout<<-1<<endl;
}
return 0;
}
给出一个数n
给出n个左括号“(”右括号“)”。
找需要给出的顺序不等,
可进行两种操作
- 将括号移到最后面
- 将括号移到最前面
使其成为常规括号
“()()”、"(())()"、"(()) “和”()) “是常规的括号序列,但”)("、"()(“和”())) "不是
由题意可以得到,该题是寻找非常规括号的个数。
先一步一步将括号配对,将先前出现的“(”存起来,若后有“)”与其配对,则将两括号都消去,最终没有配对的“)”就为需要进行操作的步数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int sum=0;
int n;
cin>>n;
char a[60];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
stack <char> b;
for(int i=0;i<n;i++)
{
if(a[i]=='(')
b.push(a[i]);
if(a[i]==')')
{
if(b.empty())
sum++;
else
b.pop();
}
}
cout<<sum<<endl;
}
return 0;
}
给出n和k
n为数的个数,k为整除数
开始给出一个x=0;
每步进行两个操作
- a[i+1];x++;
- x++;
求其需要使全部的数全部为k的倍数的步数
从0开始到k为一个周期,每个周期中都有对应得数加x刚好得到k的倍数。
每个数需要加的数<k
可以得到每个需要加的数为key=(k-a[i]%k)k
所以只需要求需要加的数相同的a[i]最多的数,因为最后一个周期数N,不是完整的,所以需要加最大的那个key加,得到(N-1)*k+key+1为答案
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
map<int ,int>m;
int main()
{
int t;
cin>>t;
while(t--)
{
m.clear();
int n;
cin>>n;
int num=n;
int k;
cin>>k;
int Max=0;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
num=(k-a%k)%k;
if(num!=0)
m[num]++;
if(Max<m[num])
Max=m[num];
}
vector<int> v;
for(auto[key,value]:m)
if(value==Max)
v.push_back(key);
sort(v.begin(),v.end());
if(Max!=0)
cout<<(Max-1ll)*k+v.back()+1<<endl;
else
cout<<"0"<<endl;
}
return 0;
}
给出n本书,男孩和和女孩至少选择k本书
男孩和女孩可以同时看一本。男孩和女孩必须选择自己喜欢的书,每本书的阅读时常为t,男孩喜欢则a=1,女孩喜欢则b=1;
可将选择分为两种
- 选择男孩女孩都喜欢的
- 选择男孩喜欢的一本,选择女孩喜欢的一本。
将两种情况进行比较,即可得到最少的阅读时间
非第一种情况则必为第二种情况,所以可将第二种情况进行加工。男孩喜欢和女孩喜欢的书的时间按从小到大的顺序相加存入数组,最后将其与男孩女孩都喜欢的书看的时间存入数组。
将他们按从小到大的顺序排列,找到前k项即可得到最小时间
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
vector <int>ab,a,b;
int main()
{
int n,k;
cin>>n>>k;
int t,x,y;
int q=0,e=0;
int cnt1=0,cnt2=0;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>t>>x>>y;
if(x==1&&y==1)
{
q++;
e++;
ab.push_back(t);
}
else if(x==1&&y==0)
{
cnt1++;
q++;
a.push_back(t);
}
else if(x==0&&y==1)
{
cnt2++;
e++;
b.push_back(t);
}
}
if(q<k||e<k)
{
cout<<-1<<endl;
}
else
{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int min1;
min1=min(cnt1,cnt2);
for(int i=0;i<min1;i++)
{
ab.push_back(a[i]+b[i]);
}
sort(ab.begin(),ab.end());
for(int i=0;i<k;i++)
{
sum+=ab[i];
}
cout<<sum<<endl;
}
return 0;
}
上一篇: Hello World!
推荐阅读
-
codeforces round #653
-
Educational Codeforces Round 25 F. String Compression(kmp+dp)
-
CodeForces - 825F(DP)
-
Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集
-
CodeForces 825F String Compression---这个KMP很DP
-
cf Educational Codeforces Round 25 F. String Compression
-
Codeforces 825F - String Compression
-
codeforces 825F (简单dp + KMP)
-
Codeforces 825F String Compression DP(最小循环节)
-
Codeforces #345div1 C Table Compression (650C) 并查集