zoukankan      html  css  js  c++  java
  • ZOJ

    参考自:https://blog.csdn.net/qq_36553623/article/details/78445558

    题意:

    第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q次A题

    接下来n个数表示n个队伍所在位置(1<=ai<=m)

    再接下来q行,每行a, b表示第a个队伍在第b秒A了一道题

    有一个只会每一秒顺时针移动一个位置的发气球机器人

    只要当前队伍有题目已经A了就会给他对应数量的气球(当然每道题最多1个气球)

    如果a队伍在b时刻A了一道题,并在c时刻才拿到气球,那么这个队伍就会积累c-b点不开心值

    求一个机器人起始位置(一开始是第0秒)使得所有队伍最终不开心值之和最小

    思路:

    对于一次ac,不开心值 = 当前位置 - 初始位置 - ac时间 也就是 不开心值 = a[i] - 1 - time

    假设机器人现在是在1位置,计算出了所有交题的不开心值的和sum,现在改变初始位置1,变为x

    现在的不开心值 = sum - 改变位置后减少的时间 + 改变位置后增加的时间

    改变位置后减少的时间 = (p - x) * dis[x]

    改变位置后增加的时间 = (m - dis[x]) * x

    sum - (p - x) * dis[x] + x * (m - dis[x]) = sum + m * x - dis[x] * p

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 2e6+10;
    ll dis[maxn], a[maxn];
    int main() {
    	ll t, n, m, p;
    	scanf("%d", &t);
    	while(t--) {
    		ll x, time, sum = 0;
    		scanf("%lld %lld %lld", &n, &m, &p);
    		for(int i = 1; i <= n; i++) {
    			scanf("%lld", &a[i]);
    		} 
    		for(int i = 0; i < p; i++) {
    			scanf("%lld %lld", &x, &time);
    			dis[i] = (a[x]-1-time+m) % m;
    			sum += dis[i];
    		}
    		ll ans = 0x3f3f3f3f3f3f3f3fLL; 
    		sort(dis,dis+p);
    		for(int i = 0; i < p; i++) {
    			ans = min(ans, sum+m*i-dis[i]*p);
    		}
    		printf("%lld
    ", ans);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    可以多个广告浮动的页面
    获取内容并截取长度用...替换
    用UIManager使Swing界面转换风格。
    Java FileInputStream
    win7 部署tomcat总结
    观察者模式
    Java RandomAccessFile
    Java 客户端界面功能:停止当前操作
    多线程的开启与管理
    log4j内容记录
  • 原文地址:https://www.cnblogs.com/somliy/p/9740397.html
Copyright © 2011-2022 走看看