• VJ第一周个人训练赛


    B:暴力模拟

    题意:给定X,Y两个砝码的质量,你可以选择一个砝码将其拆成质量为A、B的两个砝码,最终将得到三个砝码,你的任务就是,如何拆分会使得天平能够测得的不同质量数最多

    例子:X:4   Y:9

    我们可以将X拆分为 1和 3,这样就可以测得的最大质量数为,1,2,3,4,5,6,7,8,9,10,11,12,13。

    分析:要想知道如何拆分才会使得质量数最大,那么我们可以通过枚举每一次分法,最终取得max

    代码:

    1. #include
    2. #define int long long
    3. const int N=2e5+10;
    4. using namespace std;
    5. int a[N],s[N],sum[N];
    6. inline void solve(){
    7. int x,y;cin>>x>>y;
    8. int ans=0;
    9. set<int>se;se.clear();
    10. //拆砝码x
    11. for(int i=1;i<=x;i++){
    12. int a=i,b=x-i,c=y;
    13. se.insert(a);se.insert(b);se.insert(c);
    14. se.insert(a+b);se.insert(a+c);se.insert(b+c);se.insert(a+b+c);
    15. if(a!=b) se.insert(abs(a-b));
    16. if(a!=c) se.insert(abs(a-c));
    17. if(b!=c) se.insert(abs(b-c));
    18. if(a+b!=c) se.insert(abs(a+b-c));
    19. if(a+c!=b) se.insert(abs(a+c-b));
    20. if(b+c!=a) se.insert(abs(b+c-a));
    21. if(se.size()>ans) ans=se.size();
    22. se.clear();
    23. }
    24. //拆砝码y
    25. for(int i=1;i<=y;i++){
    26. int a=i,b=y-i,c=x;
    27. se.insert(a);se.insert(b);se.insert(c);
    28. se.insert(a+b);se.insert(a+c);se.insert(b+c);se.insert(a+b+c);
    29. if(a!=b) se.insert(abs(a-b));
    30. if(a!=c) se.insert(abs(a-c));
    31. if(b!=c) se.insert(abs(b-c));
    32. if(a+b!=c) se.insert(abs(a+b-c));
    33. if(a+c!=b) se.insert(abs(a+c-b));
    34. if(b+c!=a) se.insert(abs(b+c-a));
    35. if(se.size()>ans) ans=se.size();
    36. se.clear();
    37. }
    38. cout<"\n";
    39. }
    40. signed main(){
    41. ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    42. int T;cin>>T;
    43. while(T--) solve();
    44. }

    D:标记?

    题意:数一下有多少种线路,并处以公交车的数量。

    分析:依次标记每条路线,记录不同的路线条数,最后除以公交车的数量

    代码:

    1. #include
    2. #define int long long
    3. const int N=550;
    4. using namespace std;
    5. int x[N],y[N],vis[N][N];//vis记录从x——>y是否走过
    6. inline void solve(){
    7. int bus,m;cin>>bus>>m;
    8. memset(vis,0,sizeof vis);
    9. int res=0;
    10. for(int i=1;i<=m;i++) cin>>x[i];
    11. for(int i=1;i<=m;i++) cin>>y[i];
    12. for(int i=1;i<=m;i++){
    13. if(vis[x[i]][y[i]]==0){
    14. vis[x[i]][y[i]]=1;
    15. vis[y[i]][x[i]]=1;
    16. res++;
    17. }
    18. }
    19. cout<setprecision(3)<<(1.0*res/bus)<
    20. }
    21. signed main(){
    22. ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    23. int T;cin>>T;
    24. while(T--) solve();
    25. }

     F:暴力模拟

    题意:一个村长有N个人,M对朋友关系,当i和j的共同朋友数量大于或等于K时,双方可以变成朋友。求一段时间后有多少对新的朋友对关系建立起来。

    分析:一开始是以为并查集,然后发现是陷阱。然后别人说可以用图做,用Prim可以求解。这里选择的是暴力模拟。因为数据只有100,O(N^3)并不会超时。

    这题的关键:

    1:如何判断两人的共同朋友数量

    2:如何进行关系合并

    3:合并后,如何再判朋友关系的数量

    具体看代码:

    1. #include
    2. using namespace std;
    3. int f[150][150];
    4. inline void solve(){
    5. int n,m,k;cin>>n>>m>>k;
    6. memset(f,0,sizeof(f));
    7. for(int i=0;i//处理朋友关系
    8. int x,y;cin>>x>>y;
    9. f[x][y]=f[y][x]=1;
    10. }
    11. int s1=0,s2=0,s3=0;
    12. while(1){
    13. s1=0;
    14. for(int i=0;i//枚举所有人的关系情况
    15. for(int j=i+1;j
    16. if(f[i][j]==0){//如果i跟j不是朋友
    17. s2=0;
    18. for(int t=0;t//枚举i和j共同朋友
    19. if(f[i][t]&&f[j][t]) s2++;//记录共同朋友个数
    20. }
    21. if(s2>=k){//满足条件
    22. s1++;//s1是保证循环结束:即不会再有新朋友结交
    23. s3++;//新结交朋友的个数
    24. f[i][j]=f[j][i]=1;//i和j成为朋友
    25. }
    26. }
    27. }
    28. }
    29. if(s1==0) break;
    30. }
    31. cout<"\n";
    32. }
    33. int main(){
    34. ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    35. int T;cin>>T;
    36. while(T--) solve();
    37. }

    H:贪心

    题意:一个音游,分数由point * (combo*2+1)计算,假设玩家很强,combo是一直连续的。求最低分和最高分。point分成50,100,300三种。(注意:combo是从0开始的)

    输入:每个point分对应点了几次   输出:min,max

    分析:要想使分数最低,肯定是先point分从大到小开始点,分数最高则反之

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. inline void solve(){
    5. int a,b,c;cin>>a>>b>>c;
    6. int d=a+b+c;int aa=a,bb=b,cc=c;
    7. int minn=0,maxx=0;
    8. for(int i=0;i
    9. if(aa) minn+=300*(i*2+1),aa--;
    10. else if(bb) minn+=100*(i*2+1),bb--;
    11. else minn+=50*(i*2+1),cc--;
    12. }
    13. for(int i=0;i
    14. if(c) maxx+=50*(i*2+1),c--;
    15. else if(b) maxx+=100*(i*2+1),b--;
    16. else maxx+=300*(i*2+1),a--;
    17. }
    18. cout<" "<"\n";
    19. }
    20. signed main(){
    21. int t;cin>>t;
    22. while(t--) solve();
    23. }

    J:暴力枚举

    题意:给定N个小朋友围成一圈,每个小朋友手上都有对应的玩具数量,老师将抽取M个小朋友手里所有的玩具,问能够抽取的最大数。

    分析:直接暴力枚举答案即可

    代码:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N=2e5+10;
    5. int a[N];
    6. inline void solve(){
    7. int n,m;cin>>n>>m;
    8. for(int i=0;i>a[i];
    9. int cnt=0,ans=0,res=0;
    10. for(int i=0;i
    11. cnt=0,ans=0;
    12. for(int j=i%n;;j++){
    13. j%=n;
    14. ans+=a[j];cnt++;
    15. if(cnt==m) break;
    16. }
    17. res=max(res,ans);
    18. }
    19. cout<"\n";
    20. }
    21. signed main(){
    22. int t;cin>>t;
    23. while(t--) solve();
    24. }

  • 相关阅读:
    手撕JavaScript面试题
    中山大学软件工程学院区块链课程作业——信息传递网络与价值传递网络的区别和联系是什么?未来价值传递网络上可能产生的新业务有哪些?
    【校招VIP】产品行测之逻辑计算题
    C语言——结构体详解
    E. Nastya and Potions
    jQuery-DOM操作
    正版软件 | R-Drive Image:数据安全守护者,您的智能备份专家
    Python数据分析实战-使用装饰器为函数增加异常处理功能(附源码和实现效果)
    CSS 单位解析
    北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374
  • 原文地址:https://blog.csdn.net/YuDuna/article/details/127720675