2020 年 “联想杯”全国高校程序设计在线邀请赛暨第三届上海理工大学程序设计竞赛 A和C
A.Archmage
题意:法师有能量 n ,每秒可以花费 x 释放一次技能,有两种基本技能,花费x能量释放一次技能,每秒会自动恢复y能量, m 秒内能最多放几次技能
题解:x + y ≤ n 如果有 x ≤ y, 则他显然每秒都能释放一次技能,如果有 x > y, 则前 m -1 秒内恢复的魔法值都可以被利用上
答案为 
总结:做题的时候思路是有的,但是实现的时候有一个点过不了,应该是实现的方法有问题
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ ll n,m,x,y,counts=0,temp=0; cin>>n>>m>>x>>y; temp=floor((n+(m-1)*y)/x); cout<< min(temp,m)<<endl; } return 0; }
C. Cheat Sheet
题意:你有一张能最多写 n 个字符的纸,m 个可能重复的单词,你需要挑选一些不重复的写到纸上,单词之间必须用空格分隔,问最多能写下几个不同的单词
题解:保留不同的字符串,再对字符串的长度进行排序
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<set> using namespace std; set<string>a; int len[1005]; int main(){ string str[1005]; int n,m,sum=0,counts=0,flag; cin>>n>>m; for(int i=0;i<m;i++){ cin>>str[i]; a.insert(str[i]); } for(set<string>::iterator it=a.begin();it!=a.end();it++){ string s=*it; len[counts]=s.length(); counts++; } sort(len,len+counts); flag=counts; for(int i=0;i<counts;i++){ sum+=len[i]+1; if(sum-1>n){ flag=i; break; } } cout<<flag<<endl; return 0; }

浙公网安备 33010602011771号