2020年浙大城市学院新生程序设计竞赛同步赛
众所周知,年轻人是不讲5的。作为年轻人,你应该继承这样的“优良传统”。
给定一个数串,输出时将其中的数字’5’替换成字符’*’。
签到题
string s;
cin>>s;
int l=s.size();
for(int i=0;i<l;i++){
if(s[i]=='5')s[i]='*';
}
cout<<s<<endl;
因为n很小,可以直接按题意一个一个算
注意约分
#include
#include
#include
#include
#include
#include
using namespace std;
double fun(int a,int b,int c){
return ((double)a*(double)c+(double)b)/(double)pow(2,(double)c);
}
int gcd(int a,int b){
if(a%b==0)return b;
else return gcd(b,a%b);
}
int main(){
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
int idx=0;
for(int i=1;i<=n;i++){
if(fun(a,b,i)>fun(a,b,idx))idx=i;
}
int x=a*idx+b;
int y=pow(2,idx);
if(x==0)cout<<0<<endl;
else if(abs(x)%y==0) cout<<x/y<<endl;
else {
int z=gcd(abs(x),y);
cout<<x/z<<'/'<<y/z<<endl;
}
}
return 0;
}
题目是这样的:给出A,B,C三种饮料各自的数量,有三种鸡尾酒D,E,F的调制规则:
1A+1B=1D(使用一杯A饮料和一杯B饮料可以调制出一杯D鸡尾酒,下面两种规则以此类推)
1A+1C=1E
1C+1C=1F
现在,Hile要求出能调出的鸡尾酒的最大数量,但是 Hile太菜了,于是便来向你寻求帮助,你能告诉她答案吗?
一个贪心,依次用B,A,C尽量用完
int a,b,c;
cin>>a>>b>>c;
if(a<=b){
cout<<a+c/2;//先是b
}
else {
a-=b;//用公式a把a用光
if(a>=c){
cout<<b+c;
}
else{
cout<<b+a+(c-a)/2;
}
}
新生赛开赛在即,Kwords打算预测每道题的过题人数,现在他想知道如果按照他预测的过题数据,会有多少人能够AK(全部通过)或爆零(无法通过任何一道题)呢。因为Kwords并不知道榜单实际的过题情况,所以希望你能帮助他预测AK和爆零的人数区间。
输入描述:
第一行给出一个正整数T(1≤T≤10),表示接下来会给出T组测试数据。
对于每组测试数据,
第一行给出两个正整数N(1≤N≤10^5) 表示新生赛有多少个题目,
M(1≤M≤10^9 )表示参赛人数。
第二行给出N个数字,第i个数字表示第i{}i道题通过的人数a i(0≤ ai≤ M)。
输出描述:
对于每组数据,第一行给出两个数字L1,R1表示AK的人数在区间[L1,R1]内,第二行给出两个数字L2,R2表示爆零的人数在区间[L2,R2] ]内。
输入
2
2 20
19 19
4 5
1 1 1 1
输出
18 19
0 1
0 1
1 4
最少ak的人:把解出每道题的人数改成没做出的人数
每道题都有m-ai个人做不出,让这些做不出的尽可能是不同的人
最多AK的人:ai里最小的
最多爆零的人:做出的题尽可能是同样的人
最少爆零的人:m-ai里最大的
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;
int main() {
//freopen("4.txt", "r", stdin);
//freopen("5.txt", "w", stdout);
ll T;
cin >> T;
while (T--) {
vector<ll> v;
ll n, m, sum = 0;//n题m人
scanf("%d%d", &n, &m);
for (ll i = 0; i < n; i++) {
ll x;
scanf("%d", &x);
v.push_back(x);
sum += x;
}
sort(v.begin(), v.end());
ll z = n * m - sum;
cout << max((ll)0, m - z) << " " << v[0] << endl;
cout << max(m - sum,(ll)0) << " " << m - v[n - 1] << endl;
}
return 0;
}
题意:改变尽可能少的数字,不要形成114514
因为可以输出任意一种可以的串
策略:
所有可能在修改数字后再次形成114514的情况如下
114514
1114514
11114514
114114514//把114514串里第一个1改成4
1145114514//把114514串里第一个1改成5
11451114514
其余都把那个1改成5
形成414,515 这样子就不会出现修改后出现114514的情况啦
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,a[200005];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n-5;i++){
if(a[i]==1&&a[i+1]==1&&a[i+2]==4&&a[i+3]==5&&a[i+4]==1&&a[i+5]==4){
if(i<=2||(a[i-1]==1))a[i]=5;
else if(a[i-1]==4)a[i]=4;
else if(a[i-1]==5)a[i]=5;
}
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
第三次试图用优先队列偷懒失败
用结构体将a,b序列相对应的数“绑定”,a,b序列的值是对应的,排序后老老实实扫一扫就好了
#include
#include
#include
#include
#include
#include
using namespace std;
const long long N=1e6+7;
struct node
{
int x;
int y;
bool operator<(const node& v){
return x<v.x;
}
}a[N];
int sum[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].x;
for(int i=1;i<=n;i++)
cin>>a[i].y;
sort(a+1,a+n+1);
for(int i=n;i;i--)
sum[i]=max(sum[i+1],a[i].y);
//提前存好b序列在每个位置之后序列的最大值
int ans=0x3f3f3f3f;
for(int i=0;i<=n;i++)
ans=min(ans,sum[i+1]+a[i].x);
cout<<ans<<endl;
return 0;
}
感谢雷神仙纠正了我错误的思路
k是一样的,然后剩下的必须是p的幂和q的幂
不能有其他数
看注释即可
#include
using namespace std;
const int N=2e5+10;
bool c[N];//存储可能的k值
long long a,b,p,q;
bool f;
int main(){
cin>>a>>b>>p>>q;
if(a%p||b%q||!a||!b){
printf("No\n");
return 0;
}//特判一下
a/=p;b/=q;//存在正整数x,y
c[a]=1;//x可能是1,所以这个不能忘记
if(p!=1)
while(!a%p)
a/=p,c[a]=1;
//首先p等于1就就只有a一个了,这一步把p的倍数先全部判一下
if(q==1&&c[b]&&b>1){
printf("Yes\n");return 0;}//如果b
if(q!=1){
if(c[b]&&b>1){
printf("Yes\n");return 0;}//先判断一下y==1的情况
while(!b%q){
b/=q;//时刻注意k>=2
if(c[b]&&b>1){
printf("Yes\n");return 0;}//y==2,3,4找到相同的k直接除掉
}
}
printf("No\n");//扫完了没return,说明没有
return 0;
}
8倍数的特征
/*
016 104 112 120 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240
024 248 256 264 272 280 288 296
032 304 312 320 328 336 344 352 360 368 376 384 392
040 048 400 408 416 424 432 440 448 456 464 472 480 488 496
056 504 512 520 528 536 544 552 560 568 576 584 592
064 600 608 616 624 632 640 648 656 664 672 680 688 696
072 704 712 720 728 736 744 752 760 768 776 784 792
008 080 88 800 808 816 824 832 840 848 856 864 872 880 888 896
096 904 912 920 928 936 944 952 960 968 976 984 992
*/
//全为偶数,最后三位被8整除
试图打表失败的废墟
应该是搜索