A
题目描述
DK 想出一道超级没有素质的题
DK 给了你一个标准的时钟,初始时间在 12:00
每分钟分针会顺时针转动 6°,而时针会顺时针转动 0.5°
DK 想知道,t 分钟后,时针和分针的较小夹角的大小是多少
由于这题超级没有素质,所以你需要将答案四舍五入到整数
思路:简单模拟,找到t分钟后,时针和分针的位置,然后找到大的那个夹角,最后四舍五入即可。
代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
double a,b;

int main()
{
    int n;
    scanf("%d",&n);
    while(n--){
        int x;
        scanf("%d",&x);
        a=x*0.5,b=x*6.0;
        while(a>=360)a-=360;
        while(b>=360)b-=360;
        double ans=min(abs(a-b),360-abs(a-b));//cout<<ans;
        if(ans!=(int)ans)ans++;
        printf("%d\n",(int)ans);
    }
    return 0;
}

B:
题目描述
给你一个长度为 n 的序列,第 i 个数为 ai
将这个序列分割成 i 个不重合的子串,从每个子串中取出最大的 j 个数作为这个分割方法的价值,记价值最大的分割方法的价值为 val(i,j)
但是金发少女 DK 觉得这太好算了,于是她要你求下面的式子。
思路:通过划分,你总可以得到最大的数,所以直接排序然后求答案就行。
代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
long long a[100005];
bool cmp(long long c,long long d)
{
    return c>d;
}
long long sum=0;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%lld",&a[i]);
    sort(a,a+n,cmp);
    for(int i=1;i<n;i++)a[i]+=a[i-1];
    int x,y;
    scanf("%d%d",&x,&y);
    for(int i=1;i<=x;i++){
        for(int j=1;j<=y;j++)
            sum+=a[i*j-1];
    }
    printf("%lld\n",sum);
    return 0;
}

C:
图片说明
思路:通过观察发现,总可以选到最大生成树上的边,而且每条边恰好选一次。
代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct Node{
    int u,v;
    long long w;
}a[500005];
int fa[500005],n,m;
void init()
{
    for(int i=0;i<=n;i++)fa[i]=i;
}
int findfa(int x)
{
    return x==fa[x]?x:fa[x]=findfa(fa[x]);
}
void con(int x,int y)
{
    fa[findfa(x)]=findfa(y);
}
bool cmp(Node c,Node d)
{
    return c.w>d.w;
}
bool vis[500005];
int ans[500005];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].w);
    }
    init();
    sort(a,a+m,cmp);
    long long sum=0;
    for(int i=0;i<m;i++){
        if(findfa(a[i].u)!=findfa(a[i].v))con(a[i].u,a[i].v);
        else continue;
        sum+=a[i].w;
    }
    printf("%lld\n",sum);
    return 0;
}