codeforces gym100851 Generators 暴力+贪心
生活随笔
收集整理的這篇文章主要介紹了
codeforces gym100851 Generators 暴力+贪心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://codeforces.com/gym/100851
題目大意:給nnn個隨機數生成器:xi=(xi?1?a+b)%cx_i=(x_{i-1}*a+b)\%cxi?=(xi?1??a+b)%c,(0<=a,b<=1000,0<=x0<c<10000<=a,b<=1000,0<=x_0<c<10000<=a,b<=1000,0<=x0?<c<1000),現在要從它們對應的每一個序列中選取一個數,使得總和最大且這個總和不能被kkk整除。
思路:看數據范圍,可以暴力找出循環節,即暴力得到所有序列,從而得到每一個序列的最大的數的總和sumsumsum,若sum%k!=0sum\%k!=0sum%k!=0,那么答案就是sumsumsum,否則我們對于每一個序列找到MAXi?AijMAX_i-A_{ij}MAXi??Aij?最小的且不能被kkk整除的數,再從這nnn個數中找到最小的那個數,記為MINMINMIN,答案就是sum?MINsum-MINsum?MIN。復雜度O(cmax?n)O(c_{max}*n)O(cmax??n)。
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll;bool vis[1005]; int tmp[10005]; int ans[10005]; int re[10]; int n,k,x,a,b,c;int main() {freopen("generators.in","r",stdin);freopen("generators.out","w",stdout);scanf("%d %d",&n,&k);int sum=0,len=0,MAX=0,siz=0,MIN=INF;for(int i=1;i<=n;i++){MAX=-1;siz=0;scanf("%d %d %d %d",&x,&a,&b,&c);while(!vis[x]){if(x>MAX){MAX=x;ans[i]=siz;}vis[x]=1;tmp[siz++]=x;x=(x*a+b)%c;}sum+=MAX;int u;for(int j=0;j<siz;j++){vis[tmp[j]]=0;u=MAX-tmp[j];if(u<MIN&&u%k!=0)MIN=u,re[0]=i,re[1]=j;}}if(sum%k==0){if(MIN==INF)printf("-1\n");else{printf("%d\n",sum-MIN);ans[re[0]]=re[1];for(int i=1;i<=n;i++)printf("%d ",ans[i]);printf("\n");}}else{printf("%d\n",sum);for(int i=1;i<=n;i++)printf("%d ",ans[i]);printf("\n");}return 0; }總結
以上是生活随笔為你收集整理的codeforces gym100851 Generators 暴力+贪心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晶体三极管
- 下一篇: 缠论指标(全网最精准)